Sekaannusmatriisi selitettynä
Muodosta sekaannusmatriisi ennusteista ja todellisista arvoista ja johda siitä oikein luokitellut positiiviset, väärin luokitellut negatiiviset ja muut vastaavat lukumäärät.
Sekaannusmatriisi selitettynä on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Tarkkuutta pidemmälle: virheiden ymmärtäminen
Tarkkuus kertoo oikeiden ennusteiden prosenttiosuuden, mutta käsittelee kaikkia virheitä samanarvoisina. Todellisuudessa erityyppisillä virheillä voi olla hyvin erilaiset seuraukset. Roskapostisuodatin, joka siirtää asiallisen sähköpostin roskapostikansioon, on harmillinen; lääketieteellinen diagnostiikkamalli, joka ei havaitse syöpätapausta, voi vaarantaa hengen.
Sekaannusmatriisi on työkalu, joka erittelee luokittelijan suorituskyvyn 2×2-taulukoksi (binäärisessä luokittelussa) ja näyttää kaikki todellisten ja ennustettujen luokkatunnisteiden mahdolliset yhdistelmät. Se paljastaa paitsi kuinka paljon malli on väärässä myös millaisia sen virheet ovat.
Sekaannusmatriisin neljä solua
Kun binäärisessä luokittelussa luokat ovat Positiivinen (1) ja Negatiivinen (0), sekaannusmatriisissa on neljä solua:
- True Positive (TP) — todellinen luokka on positiivinen ja ennustettu luokka positiivinen. Oikea havainto.
- True Negative (TN) — todellinen luokka on negatiivinen ja ennustettu luokka negatiivinen. Oikea hylkäys.
- False Positive (FP) — todellinen luokka on negatiivinen ja ennustettu luokka positiivinen. Tyypin I virhe; väärä hälytys.
- False Negative (FN) — todellinen luokka on positiivinen ja ennustettu luokka negatiivinen. Tyypin II virhe; havaitsematta jäänyt tapaus.
Kaikkia neljää lukumäärää tarvitaan luokittelijan toiminnan kattavaan kuvaamiseen.
import numpy as np
# Medical test example:
# Positive = disease present, Negative = disease absent
y_true = np.array([1, 0, 1, 1, 0, 0, 1, 0, 1, 0])
y_pred = np.array([1, 0, 1, 0, 1, 0, 1, 0, 0, 0])
TP = ((y_pred == 1) & (y_true == 1)).sum()
TN = ((y_pred == 0) & (y_true == 0)).sum()
FP = ((y_pred == 1) & (y_true == 0)).sum()
FN = ((y_pred == 0) & (y_true == 1)).sum()
print(f'TP={TP} FP={FP}')
print(f'FN={FN} TN={TN}')
print(f'Total: {TP+TN+FP+FN}')Sekaannusmatriisin muodostaminen scikit-learnilla
Scikit-learnin confusion_matrix()-funktio ottaa todelliset ja ennustetut luokkatunnisteet ja palauttaa matriisin NumPy-taulukkona. Scikit-learnissa käytettävän käytännön mukaan rivit vastaavat todellista luokkaa ja sarakkeet ennustettua luokkaa.
Binäärisessä luokittelussa, kun luokkatunnisteet ovat [0, 1], matriisin rakenne on:
- Rivi 0, sarake 0 = TN (todellinen 0, ennustettu 0)
- Rivi 0, sarake 1 = FP (todellinen 0, ennustettu 1)
- Rivi 1, sarake 0 = FN (todellinen 1, ennustettu 0)
- Rivi 1, sarake 1 = TP (todellinen 1, ennustettu 1)
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train_s, y_train)
y_pred = model.predict(X_test_s)
cm = confusion_matrix(y_test, y_pred)
print('Confusion matrix:')
print(cm)
print('\nRows=Actual, Cols=Predicted')Sekaannusmatriisin visualisointi lämpökarttana
Lämpökarttana visualisoitu sekaannusmatriisi tekee lukumääristä heti helposti luettavia. Suuret luvut diagonaalilla (ylävasemmalta alaoikealle) ilmaisevat oikeita ennusteita. Suuret luvut diagonaalin ulkopuolella ilmaisevat virheitä, jotka vaativat tutkimista.
Käytä seabornin heatmap()-funktiota asetuksilla annot=True ja fmt='d', jotta kokonaislukumäärät näkyvät kussakin solussa. Kohdeluokkien nimien lisääminen tekee kuvaajasta itsestään selittävän ilman erillistä selitettä.
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
class_names = ['Malignant', 'Benign'] # breast cancer dataset
plt.figure(figsize=(7, 6))
sns.heatmap(
cm,
annot=True,
fmt='d',
cmap='Blues',
xticklabels=class_names,
yticklabels=class_names
)
plt.ylabel('Actual Label')
plt.xlabel('Predicted Label')
plt.title('Confusion Matrix — Breast Cancer Classifier')
plt.show()Tarkkuuden johtaminen sekaannusmatriisista
Jokainen luokittelumittari voidaan johtaa sekaannusmatriisin neljästä solusta. Tarkkuus on yksinkertaisin mittari — se on diagonaalille (TP + TN) osuvien ennusteiden osuus kaikista ennusteista:
Accuracy = (TP + TN) / (TP + TN + FP + FN)
Kaikki ennusteet ovat oikeita. Kaikki ennusteet = TP + TN + FP + FN. Jos testijoukossa on 100 esimerkkiä ja arvot ovat TP=40, TN=50, FP=5, FN=5, tarkkuus = 90/100 = 0.90. Viidellä FN-virheellä (havaitsematta jääneillä positiivisilla tapauksilla) voi kuitenkin olla paljon vakavammat seuraukset kuin viidellä FP-virheellä.
from sklearn.metrics import confusion_matrix, accuracy_score
import numpy as np
y_true = np.array([1, 0, 1, 1, 0, 0, 1, 0, 1, 0])
y_pred = np.array([1, 0, 1, 0, 1, 0, 1, 0, 0, 0])
cm = confusion_matrix(y_true, y_pred)
TN, FP, FN, TP = cm.ravel() # for 2x2 matrix
# Manual accuracy
manual_acc = (TP + TN) / (TP + TN + FP + FN)
sklearn_acc = accuracy_score(y_true, y_pred)
print(f'TP={TP}, TN={TN}, FP={FP}, FN={FN}')
print(f'Manual accuracy: {manual_acc:.2f}')
print(f'sklearn accuracy: {sklearn_acc:.2f}')Tyypin I ja tyypin II virheet
Tilastotieteessä ja koneoppimisessa virheillä on muodolliset nimet, jotka kuvaavat niiden vakavuutta eri tilanteissa:
- Tyypin I virhe = False Positive. Hälytys annetaan, vaikka huoleen ei ole aihetta. Esimerkki: asiallisen maksutapahtuman merkitseminen petokseksi tai henkilön lähettäminen tarpeettomasti sairaalaan.
- Tyypin II virhe = False Negative. Todellinen tapahtuma jää havaitsematta. Esimerkki: vilpillisen maksutapahtuman hyväksyminen tai syöpäpotilaan lähettäminen kotiin terveenä.
Useimmissa tosielämän luokitteluongelmissa tyypin I ja tyypin II virheillä on hyvin erilaiset kustannukset, minkä vuoksi yksi tarkkuusluku ei riitä päätöksenteon tueksi.
Sekaannusmatriisi moniluokkaisissa ongelmissa
Kun ongelmassa on k luokkaa, sekaannusmatriisi on kooltaan k×k. Kukin rivi edustaa todellista luokkaa ja kukin sarake ennustettua luokkaa. Diagonaalin alkiot ovat oikeita ennusteita; diagonaalin ulkopuoliset alkiot ovat vääriä luokituksia.
Moniluokkaiset sekaannusmatriisit paljastavat, mitkä luokat malli sekoittaa useimmin keskenään. Esimerkiksi numerontunnistin saattaa sekoittaa usein numerot 4 ja 9, koska ne muistuttavat toisiaan. Tämä tieto ohjaa kohdennettuja parannuksia: kerää lisää harjoitusesimerkkejä sekoittuvista luokista, lisää niitä erottavia piirteitä tai käsittele ennusteet jälkikäteen näiden tiettyjen luokkien parien osalta.
from sklearn.metrics import confusion_matrix
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
import seaborn as sns
import matplotlib.pyplot as plt
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = DecisionTreeClassifier(max_depth=10)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(9, 7))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Digit Confusion Matrix (10 classes)')
plt.show()Normalisoitu sekaannusmatriisi
Kun luokissa on eri määrä esimerkkejä (luokkien epätasapaino), sekaannusmatriisin absoluuttiset lukumäärät voivat johtaa harhaan. Normalisoitu sekaannusmatriisi jakaa kunkin rivin kyseisen luokan todellisten esimerkkien kokonaismäärällä ja muuntaa raakalukumäärät recall-arvoiksi (oikein tunnistettujen osuudeksi).
Täydellisessä luokittelijassa jokaisessa diagonaalisolussa on 1.0 ja kaikkialla muualla 0.0. Normalisoidun matriisin avulla luokkakohtaista suorituskykyä on helppo verrata luokan koosta riippumatta.
from sklearn.metrics import confusion_matrix
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
cm = confusion_matrix(y_test, y_pred)
# Normalise by row (actual class total)
cm_norm = cm.astype(float) / cm.sum(axis=1, keepdims=True)
plt.figure(figsize=(9, 7))
sns.heatmap(cm_norm, annot=True, fmt='.2f', cmap='Blues')
plt.ylabel('Actual Class')
plt.xlabel('Predicted Class')
plt.title('Normalised Confusion Matrix (row = recall per class)')
plt.show()
# Per-class recall from diagonal
print('Per-class recall:', np.diag(cm_norm).round(3))ConfusionMatrixDisplay: scikit-learnin virallinen työkalu
Scikit-learn tarjoaa ConfusionMatrixDisplay-luokan korkean tason työkaluna sekaannusmatriisien piirtämiseen ilman seabornia. Voit luoda sen suoraan sekaannusmatriisitaulukosta tai kutsumalla from_estimator()-metodia, joka suorittaa ennustamisen sisäisesti.
Asettamalla display_labels-parametrin luokkiesi nimiksi teet kuvaajasta heti itsensä selittävän. Näyttö sisältää myös valinnaisen väripalkin, jonka avulla lukija voi arvioida arvoja ennen tarkkojen lukujen lukemista.
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.datasets import load_breast_cancer
X, y = load_breast_cancer(return_X_y=True)
class_names = load_breast_cancer().target_names # ['malignant', 'benign']
# Method 1: from_estimator (runs predict internally)
disp = ConfusionMatrixDisplay.from_estimator(
model,
X_test_s,
y_test,
display_labels=class_names,
cmap='Blues'
)
disp.ax_.set_title('Confusion Matrix')Mitä sekaannusmatriisi kertoo
Hyvin opetetulla luokittelijalla useimpien esimerkkien pitäisi olla diagonaalilla. Kun diagonaalin ulkopuolella näkyy suuria lukuja, selvitä syy:
- Paljon FP-virheitä (väärät positiiviset): malli on liian aggressiivinen — laske päätöskynnystä tai lisää regularisointia.
- Paljon FN-virheitä (väärät negatiiviset): malli ei havaitse liian monia todellisia positiivisia tapauksia — laske kynnystä tai paranna recall-arvoa.
- Luokkien A ja B väliset symmetriset virheet: luokat ovat piirreavaruudessa liian samankaltaisia — lisää niitä erottavia piirteitä.
- Virheet keskittyvät yhteen todelliseen luokkaan: luokka on aliedustettuna tai vaikeampi oppia — ylinäytteistä sitä tai kerää lisää dataa.
Sekaannusmatriisista täydelliseen luokitteluraporttiin
Jokainen classification_report()-funktion metriikka johdetaan sekaannusmatriisista. Kun ymmärrät matriisin, ymmärrät kaikki metriikat kerralla. TP:n, TN:n, FP:n ja FN:n avulla voit laskea:
- Accuracy = (TP+TN)/N
- Precision = TP/(TP+FP)
- Recall = TP/(TP+FN)
- Specificity = TN/(TN+FP)
- F1 = 2×Precision×Recall/(Precision+Recall)
Seuraavassa oppitunnissa opit hallitsemaan kaikki nämä johdetut metriikat ja ymmärrät, milloin kutakin niistä kannattaa käyttää.
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np
y_true = np.array([1, 0, 1, 1, 0, 0, 1, 0, 1, 0])
y_pred = np.array([1, 0, 1, 0, 1, 0, 1, 0, 0, 0])
cm = confusion_matrix(y_true, y_pred)
TN, FP, FN, TP = cm.ravel()
# Compute all metrics from raw counts
precision = TP / (TP + FP) if (TP + FP) > 0 else 0
recall = TP / (TP + FN) if (TP + FN) > 0 else 0
f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0
print(f'Precision: {precision:.2f}')
print(f'Recall: {recall:.2f}')
print(f'F1-Score: {f1:.2f}')
print('\nscikit-learn report:')
print(classification_report(y_true, y_pred))Pikatesti
Testaa, miten hyvin ymmärrät tämän oppitunnin Machine Learning with Python -aiheen käsitteet.
Oppitunnin kertaus
Tässä oppitunnissa opit, että sekaannusmatriisi jakaa luokittelijan virheet todellisiin positiivisiin, todellisiin negatiivisiin, vääriin positiivisiin ja vääriin negatiivisiin, väärillä negatiivisilla (tyypin II virheet) ja väärillä positiivisilla (tyypin I virheet) on hyvin erilaiset seuraukset tosielämässä ja kaikki luokittelumetriikat — accuracy, precision, recall ja F1 — johdetaan näistä neljästä sekaannusmatriisin lukumäärästä. Seuraavaksi perehdymme precisioniin, recalliin ja F1-scoreen sekä niiden väliseen keskeiseen kompromissiin, joka ohjaa luokittelijoiden arviointia tosielämässä.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Sekaannusmatriisi selitettynä” ilmainen?
Kyllä – oppitunnin ”Sekaannusmatriisi selitettynä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Sekaannusmatriisi selitettynä”?
Muodosta sekaannusmatriisi ennusteista ja todellisista arvoista ja johda siitä oikein luokitellut positiiviset, väärin luokitellut negatiiviset ja muut vastaavat lukumäärät. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Sekaannusmatriisi selitettynä”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?
Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Regressiosta luokitteluun: kynnysarvopäätökset
- Logistinen regressio ja sigmoidifunktio
- Sekaannusmatriisi selitettynä
- Precision, recall ja F1-pistemäärä käytännössä