Selles viimases regressiooni õppetunnis, mis on üks klassikalistest ML-tehnikatest, vaatame logistilist regressiooni. Seda tehnikat kasutatakse mustrite avastamiseks, et ennustada binaarseid kategooriaid. Kas see komm on šokolaad või mitte? Kas see haigus on nakkav või mitte? Kas see klient valib selle toote või mitte?
Selles õppetunnis õpid:
- Uut andmete visualiseerimise teeki
- Logistilise regressiooni tehnikaid
✅ Süvenda oma arusaamist selle regressioonitüübi kasutamisest Learn moodulis
Olles töötanud kõrvitsate andmetega, oleme nüüd piisavalt tuttavad, et mõista, et seal on üks binaarne kategooria, millega saame töötada: Color.
Loome logistilise regressioonimudeli, et ennustada, millise värviga kõrvits tõenäoliselt on (oranž 🎃 või valge 👻), arvestades mõningaid muutujaid.
Miks me räägime binaarsest klassifikatsioonist regressiooni õppetundide grupis? Lihtsalt keelelise mugavuse huvides, kuna logistiline regressioon on tegelikult klassifikatsioonimeetod, kuigi lineaarne. Õpi teisi viise andmete klassifitseerimiseks järgmises õppetundide grupis.
Meie eesmärkide jaoks väljendame seda binaarselt: 'Valge' või 'Mitte valge'. Meie andmestikus on ka 'triibuline' kategooria, kuid selle esinemisi on vähe, seega me ei kasuta seda. See kaob niikuinii, kui eemaldame andmestikust nullväärtused.
🎃 Lõbus fakt: me kutsume valgeid kõrvitsaid mõnikord 'kummitus' kõrvitsateks. Neid pole väga lihtne nikerdada, seega pole nad nii populaarsed kui oranžid, kuid nad näevad lahedad välja! Seega võiksime oma küsimuse ümber sõnastada: 'Kummitus' või 'Mitte kummitus'. 👻
Logistiline regressioon erineb lineaarse regressioonist, mida sa õppisid varem, mitmel olulisel viisil.
🎥 Klõpsa ülaloleval pildil, et vaadata lühikest videot logistilise regressiooni ülevaatest.
Logistiline regressioon ei paku samu funktsioone kui lineaarne regressioon. Esimene pakub ennustust binaarse kategooria kohta ("valge või mitte valge"), samas kui teine suudab ennustada pidevaid väärtusi, näiteks arvestades kõrvitsa päritolu ja koristusaega, kui palju selle hind tõuseb.
Infograafik autorilt Dasani Madipalli
On olemas ka teisi logistilise regressiooni tüüpe, sealhulgas multinomiaalne ja ordinaalne:
- Multinomiaalne, mis hõlmab rohkem kui ühte kategooriat - "Oranž, Valge ja Triibuline".
- Ordinaalne, mis hõlmab järjestatud kategooriaid, kasulik, kui tahame oma tulemusi loogiliselt järjestada, näiteks kõrvitsad, mis on järjestatud piiratud arvu suuruste järgi (mini, väike, keskmine, suur, XL, XXL).
Kas mäletad, kuidas lineaarne regressioon töötas paremini rohkem korreleeruvate muutujatega? Logistiline regressioon on vastupidine - muutujad ei pea olema seotud. See sobib selle andmestiku jaoks, millel on suhteliselt nõrgad korrelatsioonid.
Logistiline regressioon annab täpsemaid tulemusi, kui kasutad rohkem andmeid; meie väike andmestik pole selle ülesande jaoks optimaalne, seega pea seda meeles.
✅ Mõtle, millised andmetüübid sobiksid hästi logistilisele regressioonile
Kõigepealt puhasta andmed veidi, eemaldades nullväärtused ja valides ainult mõned veerud:
-
Lisa järgmine kood:
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplace=True)
Saad alati oma uuele andmestikule pilgu heita:
pumpkins.info
Praeguseks oled taas laadinud algusmärkmiku kõrvitsaandmetega ja puhastanud selle, et säilitada andmestik, mis sisaldab mõningaid muutujaid, sealhulgas Color. Visualiseerime andmestiku märkmikus, kasutades teist teeki: Seaborn, mis on ehitatud Matplotlibi peale, mida kasutasime varem.
Seaborn pakub huvitavaid viise andmete visualiseerimiseks. Näiteks saad võrrelda andmete jaotusi iga Variety ja Color jaoks kategoorilises graafikus.
-
Loo selline graafik, kasutades funktsiooni
catplot, meie kõrvitsaandmeidpumpkinsja määrates värvikaardistuse iga kõrvitsakategooria jaoks (oranž või valge):import seaborn as sns palette = { 'ORANGE': 'orange', 'WHITE': 'wheat', } sns.catplot( data=pumpkins, y="Variety", hue="Color", kind="count", palette=palette, )
Vaadates andmeid, näed, kuidas
Colorandmed seostuvadVariety-ga.✅ Selle kategoorilise graafiku põhjal, milliseid huvitavaid uurimusi sa ette kujutad?
Meie kõrvitsaandmestik sisaldab stringiväärtusi kõigi veergude jaoks. Kategooriliste andmetega töötamine on inimestele intuitiivne, kuid mitte masinatele. Masinõppe algoritmid töötavad hästi numbritega. Seetõttu on kodeerimine väga oluline samm andmete eeltöötluse faasis, kuna see võimaldab meil muuta kategoorilised andmed numbrilisteks andmeteks, kaotamata teavet. Hea kodeerimine aitab luua hea mudeli.
Tunnuste kodeerimiseks on kaks peamist tüüpi kodeerijaid:
-
Ordinaalne kodeerija: see sobib hästi ordinaalsete muutujate jaoks, mis on kategoorilised muutujad, kus nende andmed järgivad loogilist järjestust, nagu
Item Sizeveerg meie andmestikus. See loob kaardistuse, kus iga kategooriat esindab number, mis on kategooria järjekord veerus.from sklearn.preprocessing import OrdinalEncoder item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] ordinal_features = ['Item Size'] ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
-
Kategooriline kodeerija: see sobib hästi nominaalsete muutujate jaoks, mis on kategoorilised muutujad, kus nende andmed ei järgi loogilist järjestust, nagu kõik tunnused, mis erinevad
Item Size-st meie andmestikus. See on ühekuum kodeerimine, mis tähendab, et iga kategooriat esindab binaarne veerg: kodeeritud muutuja on võrdne 1-ga, kui kõrvits kuulub sellesseVariety-sse, ja 0-ga, kui mitte.from sklearn.preprocessing import OneHotEncoder categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] categorical_encoder = OneHotEncoder(sparse_output=False)
Seejärel kasutatakse ColumnTransformer-it, et kombineerida mitu kodeerijat üheks sammuks ja rakendada neid sobivatele veergudele.
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)Teiselt poolt, sildi kodeerimiseks kasutame scikit-learn LabelEncoder klassi, mis on utiliitklass, mis aitab normaliseerida silte nii, et need sisaldaksid ainult väärtusi vahemikus 0 kuni n_classes-1 (siin, 0 ja 1).
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])Kui oleme tunnused ja sildi kodeerinud, saame need ühendada uueks andmestikuks encoded_pumpkins.
encoded_pumpkins = encoded_features.assign(Color=encoded_label)✅ Millised on ordinaalse kodeerija kasutamise eelised Item Size veeru jaoks?
Nüüd, kui oleme oma andmed eeltöötlenud, saame analüüsida tunnuste ja sildi vahelisi suhteid, et mõista, kui hästi mudel suudab sildi ennustada, arvestades tunnuseid.
Parim viis sellise analüüsi tegemiseks on andmete graafikule kandmine. Kasutame taas Seaborn catplot funktsiooni, et visualiseerida suhteid Item Size, Variety ja Color vahel kategoorilises graafikus. Andmete paremaks graafikule kandmiseks kasutame kodeeritud Item Size veergu ja kodeerimata Variety veergu.
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")Kuna Color on binaarne kategooria (Valge või Mitte), vajab see 'spetsiaalset lähenemist visualiseerimiseks'. On ka teisi viise, kuidas visualiseerida selle kategooria suhet teiste muutujatega.
Saad visualiseerida muutujaid kõrvuti Seaborn graafikutega.
-
Proovi 'swarm' graafikut, et näidata väärtuste jaotust:
palette = { 0: 'orange', 1: 'wheat' } sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
Ole ettevaatlik: ülaltoodud kood võib genereerida hoiatuse, kuna Seaborn ei suuda esitada sellist hulka andmepunkte 'swarm' graafikus. Võimalik lahendus on vähendada markeri suurust, kasutades 'size' parameetrit. Kuid ole teadlik, et see mõjutab graafiku loetavust.
🧮 Näita mulle matemaatikat
Logistiline regressioon tugineb 'maksimaalse tõenäosuse' kontseptsioonile, kasutades sigmoidfunktsioone. 'Sigmoidfunktsioon' graafikul näeb välja nagu 'S'-kuju. See võtab väärtuse ja kaardistab selle vahemikku 0 kuni 1. Selle kõverat nimetatakse ka 'logistiliseks kõveraks'. Selle valem näeb välja selline:
kus sigmoidi keskpunkt asub x-i 0 punktis, L on kõvera maksimaalne väärtus ja k on kõvera järskus. Kui funktsiooni tulemus on suurem kui 0.5, antakse vastavale sildile binaarse valiku klass '1'. Kui mitte, klassifitseeritakse see kui '0'.
Mudeli ehitamine nende binaarsete klassifikatsioonide leidmiseks on Scikit-learnis üllatavalt lihtne.
🎥 Klõpsa ülaloleval pildil, et vaadata lühikest videot lineaarse regressioonimudeli ehitamisest
-
Vali muutujad, mida soovid kasutada oma klassifikatsioonimudelis, ja jaga treening- ja testkomplektid, kutsudes
train_test_split():from sklearn.model_selection import train_test_split X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] y = encoded_pumpkins['Color'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
Nüüd saad oma mudelit treenida, kutsudes
fit()oma treeningandmetega, ja prindi selle tulemus:from sklearn.metrics import f1_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('F1-score: ', f1_score(y_test, predictions))
Vaata oma mudeli skooritabelit. See pole halb, arvestades, et sul on ainult umbes 1000 rida andmeid:
precision recall f1-score support 0 0.94 0.98 0.96 166 1 0.85 0.67 0.75 33 accuracy 0.92 199 macro avg 0.89 0.82 0.85 199 weighted avg 0.92 0.92 0.92 199 Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1] F1-score: 0.7457627118644068
Kuigi saad skooritabeli aruande terminid printides ülaltoodud üksused, võid oma mudelit paremini mõista, kasutades segadusmaatriksit, et aidata meil mõista, kuidas mudel toimib.
🎓 'Segadusmaatriks' (või 'veamaatriks') on tabel, mis väljendab mudeli tõelisi vs. valesid positiivseid ja negatiivseid tulemusi, hinnates seega ennustuste täpsust.
-
Segadusmaatriksi kasutamiseks kutsu
confusion_matrix():from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions)
Vaata oma mudeli segadusmaatriksit:
array([[162, 4], [ 11, 22]])
Scikit-learnis on segadusmaatriksis read (telg 0) tegelikud sildid ja veerud (telg 1) ennustatud sildid.
| 0 | 1 | |
|---|---|---|
| 0 | TN | FP |
| 1 | FN | TP |
Mis siin toimub? Oletame, et meie mudelilt küsitakse kõrvitsate klassifitseerimist kahe binaarse kategooria vahel, kategooria 'valge' ja kategooria 'mitte-valge'.
- Kui mudel ennustab kõrvitsa mitte valgeks ja see kuulub tegelikult kategooriasse 'mitte-valge', nimetame seda tõeliseks negatiivseks, mida näitab ülemine vasakpoolne number.
- Kui mudel ennustab kõrvitsa valgeks ja see kuulub tegelikult kategooriasse 'mitte-valge', nimetame seda valeks negatiivseks, mida näitab alumine vasakpoolne number.
- Kui mudel ennustab kõrvitsa mitte valgeks ja see kuulub tegelikult kategooriasse 'valge', nimetame seda valeks positiivseks, mida näitab ülemine parempoolne number.
- Kui mudel ennustab kõrvitsa valgeks ja see kuulub tegelikult kategooriasse 'valge', nimetame seda tõeliseks positiivseks, mida näitab alumine parempoolne number. Nagu võisite arvata, on eelistatav, et tõeliste positiivsete ja tõeliste negatiivsete arv oleks suurem ning valepositiivsete ja valenegatiivsete arv väiksem, mis viitab sellele, et mudel töötab paremini.
Kuidas on segadusmaatriks seotud täpsuse ja tagasikutsumisega? Pidage meeles, et ülaltoodud klassifikatsiooniraport näitas täpsust (0,85) ja tagasikutsumist (0,67).
Täpsus = tp / (tp + fp) = 22 / (22 + 4) = 0,8461538461538461
Tagasikutsumine = tp / (tp + fn) = 22 / (22 + 11) = 0,6666666666666666
✅ K: Kuidas mudel segadusmaatriksi põhjal esines? V: Mitte halvasti; on palju tõelisi negatiivseid, kuid ka mõned valenegatiivsed.
Vaatame uuesti üle mõisted, mida varem nägime, kasutades segadusmaatriksi TP/TN ja FP/FN kaardistust:
🎓 Täpsus: TP/(TP + FP) Asjakohaste juhtumite osakaal leitud juhtumite hulgas (nt millised sildid olid õigesti märgistatud)
🎓 Tagasikutsumine: TP/(TP + FN) Asjakohaste juhtumite osakaal, mis leiti, olenemata sellest, kas need olid õigesti märgistatud või mitte
🎓 f1-skoor: (2 * täpsus * tagasikutsumine)/(täpsus + tagasikutsumine) Täpsuse ja tagasikutsumise kaalutud keskmine, kus parim on 1 ja halvim 0
🎓 Tugi: Iga leitud sildi esinemiste arv
🎓 Täpsus: (TP + TN)/(TP + TN + FP + FN) Protsent siltidest, mis on proovi puhul õigesti ennustatud.
🎓 Makro keskmine: Iga sildi kaalumata keskmiste mõõdikute arvutamine, arvestamata siltide tasakaalustamatust.
🎓 Kaalutud keskmine: Iga sildi keskmiste mõõdikute arvutamine, arvestades siltide tasakaalustamatust, kaaludes neid nende toe (iga sildi tõeliste juhtumite arvu) järgi.
✅ Kas oskad arvata, millist mõõdikut peaksid jälgima, kui soovid vähendada valenegatiivsete arvu?
🎥 Klõpsa ülaloleval pildil, et vaadata lühikest videot ROC kõveratest
Teeme veel ühe visualiseerimise, et näha nn 'ROC' kõverat:
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()Kasutades Matplotlibi, joonista mudeli Vastuvõtu Tööomaduste Kõver ehk ROC. ROC kõveraid kasutatakse sageli klassifikaatori väljundi vaatamiseks tõeliste ja valepositiivsete osas. "ROC kõveratel on tavaliselt tõeliste positiivsete määr Y-teljel ja valepositiivsete määr X-teljel." Seega on kõvera järskus ja kaugus keskjoonest kõverani olulised: soovid kõverat, mis kiiresti tõuseb ja liigub üle joone. Meie puhul on alguses valepositiivsed, kuid seejärel tõuseb joon korralikult üles ja üle:
Lõpuks kasuta Scikit-learn'i roc_auc_score API-t, et arvutada tegelik 'Kõvera Alune Pindala' (AUC):
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)Tulemus on 0.9749908725812341. Arvestades, et AUC ulatub 0-st 1-ni, soovid suurt skoori, kuna mudel, mis on oma ennustustes 100% täpne, saab AUC-iks 1; antud juhul on mudel üsna hea.
Tulevastes klassifikatsioonitundides õpid, kuidas oma mudeli skoori parandamiseks iteratsioone teha. Aga praegu, palju õnne! Oled need regressioonitunnid lõpetanud!
Logistilises regressioonis on palju rohkem avastada! Kuid parim viis õppimiseks on katsetamine. Leia andmestik, mis sobib selliseks analüüsiks, ja loo sellega mudel. Mida sa õpid? Vihje: proovi Kaggle, et leida huvitavaid andmestikke.
Loe selle Stanfordi artikli esimesi lehekülgi, mis käsitlevad logistilise regressiooni praktilisi kasutusviise. Mõtle ülesannetele, mis sobivad paremini ühe või teise tüüpi regressiooniülesannete jaoks, mida oleme seni õppinud. Mis töötaks kõige paremini?
Proovi seda regressiooni uuesti
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.











