|
|
3 weeks ago | |
|---|---|---|
| .. | ||
| solution | 3 months ago | |
| README.md | 3 weeks ago | |
| assignment.md | 3 months ago | |
| notebook.ipynb | 9 months ago | |
README.md
Classificatori di cucina 1
In questa lezione, utilizzerai il dataset che hai salvato dalla lezione precedente pieno di dati bilanciati e puliti, tutti riguardanti cucine.
Utilizzerai questo dataset con una varietà di classificatori per predire una cucina nazionale data un gruppo di ingredienti. Nel farlo, imparerai di più su alcuni dei modi in cui gli algoritmi possono essere sfruttati per compiti di classificazione.
Quiz pre-lezione
Preparazione
Presumendo che tu abbia completato la Lezione 1, assicurati che un file cleaned_cuisines.csv esista nella cartella radice /data per queste quattro lezioni.
Esercizio - predire una cucina nazionale
-
Lavorando nella cartella notebook.ipynb di questa lezione, importa quel file insieme alla libreria Pandas:
import pandas as pd cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv") cuisines_df.head()I dati appaiono così:
| Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
Ora, importa altre librerie:
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve from sklearn.svm import SVC import numpy as np -
Dividi le coordinate X e y in due data frame per l’addestramento.
cuisinepuò essere il data frame delle etichette:cuisines_label_df = cuisines_df['cuisine'] cuisines_label_df.head()Apparirà così:
0 indian 1 indian 2 indian 3 indian 4 indian Name: cuisine, dtype: object -
Elimina la colonna
Unnamed: 0e la colonnacuisine, chiamandodrop(). Salva il resto dei dati come caratteristiche su cui addestrare:cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1) cuisines_feature_df.head()Le tue caratteristiche appariranno così:
| almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
Ora sei pronto per addestrare il modello!
Scelta del classificatore
Ora che i tuoi dati sono puliti e pronti per l’addestramento, devi decidere quale algoritmo utilizzare per il lavoro.
Scikit-learn raggruppa la classificazione sotto l’apprendimento supervisionato, e in questa categoria troverai molti modi per classificare. La varietà è piuttosto confusa a prima vista. I seguenti metodi includono tutte tecniche di classificazione:
- Modelli lineari
- Support Vector Machines
- Discesa del gradiente stocastica
- Vicini più prossimi
- Processi Gaussiani
- Alberi decisionali
- Metodi ensemble (voting Classifier)
- Algoritmi multiclass e multioutput (classificazione multiclass e multilabel, classificazione multiclass-multioutput)
Puoi anche utilizzare reti neurali per classificare i dati, ma questo è fuori dallo scopo di questa lezione.
Quale classificatore scegliere?
Allora, quale classificatore dovresti scegliere? Spesso, provare diversi modelli e cercare un buon risultato è un modo per testare. Scikit-learn offre un confronto affiancato su un dataset creato, confrontando KNeighbors, SVC in due modi, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB e QuadraticDiscrinationAnalysis, mostrando i risultati visualizzati:
Grafici generati dalla documentazione di Scikit-learn
AutoML risolve questo problema in modo ordinato eseguendo questi confronti nel cloud, permettendoti di scegliere il miglior algoritmo per i tuoi dati. Provalo qui
Un approccio migliore
Un modo migliore rispetto a un’improvvisazione completa, però, è seguire le idee su questa ML Cheat sheet scaricabile. Qui scopriamo che, per il nostro problema multiclass, abbiamo alcune scelte:
Un estratto dell’Algorithm Cheat Sheet di Microsoft, che dettaglia le opzioni per la classificazione multiclass
✅ Scarica questa cheat sheet, stampala e appendila al muro!
Ragionamento
Vediamo se possiamo ragionare su diversi approcci dati i vincoli che abbiamo:
- Le reti neurali sono troppo pesanti. Dato il nostro dataset pulito ma minimale, e il fatto che stiamo eseguendo l’addestramento localmente tramite notebook, le reti neurali sono troppo pesanti per questo compito.
- Nessun classificatore a due classi. Non usiamo un classificatore a due classi, quindi scartiamo one-vs-all.
- Un albero decisionale o regressione logistica potrebbero funzionare. Un albero decisionale potrebbe funzionare, o la regressione logistica per dati multiclass.
- Gli alberi decisionali potenziati multiclass risolvono un problema diverso. L’albero decisionale potenziato multiclass è più adatto per compiti non parametrici, ad esempio compiti progettati per costruire classifiche, quindi non è utile per noi.
Uso di Scikit-learn
Useremo Scikit-learn per analizzare i nostri dati. Tuttavia, ci sono molti modi di usare la regressione logistica in Scikit-learn. Dai un’occhiata ai parametri da passare.
Fondamentalmente ci sono due parametri importanti - multi_class e solver - che dobbiamo specificare quando richiediamo a Scikit-learn di eseguire una regressione logistica. Il valore multi_class applica un certo comportamento. Il valore solver indica quale algoritmo usare. Non tutti i solver possono essere abbinati a tutti i valori di multi_class.
Secondo la documentazione, nel caso multiclass, l’algoritmo di addestramento:
- Usa lo schema one-vs-rest (OvR) se l’opzione
multi_classè impostata suovr - Usa la perdita di cross-entropy se l’opzione
multi_classè impostata sumultinomial. (Attualmente l’opzionemultinomialè supportata solo dai solver ‘lbfgs’, ‘sag’, ‘saga’ e ‘newton-cg’)."
🎓 Lo 'schema' qui può essere 'ovr' (one-vs-rest) o 'multinomial'. Poiché la regressione logistica è realmente progettata per supportare la classificazione binaria, questi schemi le permettono di gestire meglio compiti di classificazione multiclass. fonte
🎓 Il 'solver' è definito come "l’algoritmo da usare nel problema di ottimizzazione". fonte.
Scikit-learn offre questa tabella per spiegare come i solver gestiscono diverse sfide presentate da diversi tipi di strutture dati:
Esercizio - dividere i dati
Possiamo concentrarci sulla regressione logistica per la nostra prima prova di addestramento dato che l’hai imparata recentemente in una lezione precedente.
Dividi i dati in gruppi di addestramento e test chiamando train_test_split():
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
Esercizio - applicare regressione logistica
Dato che stai usando il caso multiclass, devi scegliere quale schema usare e quale solver impostare. Usa LogisticRegression con un’impostazione multiclass e il solver liblinear per addestrare.
-
Crea una regressione logistica con
multi_classimpostato suovre il solver impostato suliblinear:lr = LogisticRegression(multi_class='ovr',solver='liblinear') model = lr.fit(X_train, np.ravel(y_train)) accuracy = model.score(X_test, y_test) print ("Accuracy is {}".format(accuracy))✅ Prova un solver diverso come
lbfgs, che spesso è impostato come defaultNota, usa la funzione Pandas
ravelper appiattire i tuoi dati quando necessario.L’accuratezza è buona, oltre l’80%!
-
Puoi vedere questo modello in azione testando una riga di dati (#50):
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}') print(f'cuisine: {y_test.iloc[50]}')Il risultato è stampato:
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object') cuisine: indian✅ Prova un numero di riga diverso e verifica i risultati
-
Approfondendo, puoi verificare l’accuratezza di questa previsione:
test= X_test.iloc[50].values.reshape(-1, 1).T proba = model.predict_proba(test) classes = model.classes_ resultdf = pd.DataFrame(data=proba, columns=classes) topPrediction = resultdf.T.sort_values(by=[0], ascending = [False]) topPrediction.head()Il risultato viene stampato - la cucina indiana è la sua ipotesi migliore, con buona probabilità:
0 indian 0.715851 chinese 0.229475 japanese 0.029763 korean 0.017277 thai 0.007634 ✅ Puoi spiegare perché il modello è abbastanza sicuro che questa sia una cucina indiana?
-
Ottieni più dettagli stampando un report di classificazione, come hai fatto nelle lezioni sulla regressione:
y_pred = model.predict(X_test) print(classification_report(y_test,y_pred))precision recall f1-score support chinese 0.73 0.71 0.72 229 indian 0.91 0.93 0.92 254 japanese 0.70 0.75 0.72 220 korean 0.86 0.76 0.81 242 thai 0.79 0.85 0.82 254 accuracy 0.80 1199 macro avg 0.80 0.80 0.80 1199 weighted avg 0.80 0.80 0.80 1199
🚀Sfida
In questa lezione, hai utilizzato i tuoi dati puliti per costruire un modello di machine learning che può prevedere una cucina nazionale basata su una serie di ingredienti. Prenditi del tempo per leggere le molte opzioni che Scikit-learn fornisce per classificare i dati. Approfondisci il concetto di 'solver' per capire cosa succede dietro le quinte.
Quiz post-lezione
Revisione e autoapprendimento
Approfondisci un po’ di più la matematica dietro la regressione logistica in questa lezione
Compito
Disclaimer:
Questo documento è stato tradotto utilizzando il servizio di traduzione AI Co-op Translator. Sebbene ci impegniamo per l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o inesattezze. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale umana. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.


