Scikit-learn χ2 (chi-Quadrat) - Statistik und entsprechende Kontingenz-Tabelle
In der Dokumentation für den chi-Quadrat-univariate Funktion Auswahl der Funktion scikit-learn http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html, heißt es
Diese Kerbe kann benutzt werden, um wählen Sie die n_features features mit die höchsten Werte für das χ2 (chi-Quadrat) Statistik von X, die muss enthalten Boolesche Werte oder Frequenzen (z.B., Begriff zählt in der Dokument-Klassifizierung), im Verhältnis zu den Klassen.
Ich bin kämpfen, um zu verstehen, was die entsprechende Kontingenz-Tabelle Aussehen würde, vor allem im Fall von frequency features.
Betrachten wir zum Beispiel die unten dataset mit booleschen Funktionen und Ziele:
import numpy as np
>>> X = np.random.randint(2, size=50).reshape(10, 5)
array([[1, 0, 0, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[1, 0, 0, 0, 1],
[1, 0, 1, 1, 1],
[0, 1, 1, 0, 0],
[1, 0, 1, 1, 1],
[1, 1, 1, 1, 0]])
>>> y = np.random.randint(2, size=10)
array([1, 0, 0, 0, 1, 1, 1, 1, 0, 1])
Zu konstruieren, die Kontingenz-Tabelle mit Bezug auf die erste Funktion, die wir tun können, diese (entschuldigen Sie meine PEP8 Verletzung)
import scipy as sp
>>> contingency_table = sp.sparse.coo_matrix(
... (np.ones_like(y), (X[:, 0], y)),
... shape=(np.unique(X[:, 0]).shape[0], np.unique(y).shape[0])).A
array([[1, 2],
[3, 4]])
So, jetzt kann ich berechnen des chi-Quadrat-Statistik und Ihre p-Werte
>>> sp.stats.chi2_contingency(contingency_table)
(0.17857142857142855,
0.67260381744151676,
1,
array([[ 1.2, 1.8],
[ 2.8, 4.2]]))
- Und dies sollte im Einklang mit scikit-learn ist chi2
from sklearn.feature_selection import chi2
>>> chi2_, pval = chi2(X, y)
>>> chi2_[0], pval[0]
(0.023809523809523787, 0.87737055606414338)
...NÖ. Habe ich etwas falsch interpretiert?
Auch, was macht der Kontingenz-Tabelle Aussehen bei Frequenzen? Ich nahm an, es wäre so etwas wie
contingency_table = sp.sparse.coo_matrix(
(np.ones_like(y), (X[:, 0], y)),
shape=(X[:, 0].max()+1, np.unique(y).shape[0])).A
Aber die entsprechende Tabelle der erwarteten Häufigkeiten, der höchstwahrscheinlich mehrere null-Elemente.
Edit:
Näher zu erläutern, betrachten wir das erste feature X[:, 0]
, die, sagen wir, Geschlecht und die Ziele y
sagen, Händigkeit.
Aus dieser erhalten wir der kreuztabellierung
Right-handed Left-handed (!right-handed)
Male 1 2
Female (!male) 3 4
Und wir können beurteilen, die Bedeutung der Differenz zwischen zwei Proportionen mit dem Chi-Quadrat-test durch festlegen der erwarteten Häufigkeit
sklearn.feature_selection.chi2
tut dies direkt, ohne Rückgriff auf explizit der Berechnung der Tabelle und erhält die Noten mit einer Straffung der Verfahren, die äquivalent zu scipy.stats.chisquare
.
Nach explizit aufzählen der Tabelle oben gezeigt wird, wollte ich überprüfen, ob es im Einklang mit chi2
bei der Anwendung scipy.stats.chi2_contingency
und zu meinem Entsetzen, das ist es nicht. Ich würde gerne Fragen, warum er es nicht ist.
sklearn.feature_selection.chi2
sollte, erzielen Sie dasselbe Ergebnis, und versuchen zu verstehen, warum es nicht der Fall ist, durch die Untersuchung der Quelle..Ich finde es verwirrend, dass Sie beginnen mit der Angabe des Datensatz mit 5-Funktionen, und bauen Sie die übrigen von Ihrem Fall nur die Verwendung der ersten Funktion. Ich denke, das ist, was macht @larsmans Antwort verwirrend in diesem Zusammenhang, denn er ist die Beantwortung einer anderen Frage.
InformationsquelleAutor tiao | 2014-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten Sie eine Spalte
x
vonX
.sklearn.feature_selection.chi2
testet, obdie Frequenzen der
y
Werte, wox
1 Stimmen mit den Frequenzen dery
imdie volle Bevölkerung. (@larsman Antwort zeigt, wie Sie reproduzieren können die Berechnungen mit numpy und scipy.) Dies ist nicht die gleiche wie die standard-2x2-Kontingenz-Tabelle
Analyse der
x
undy
. In einem 2x2-Kontingenz-Tabelle-Analyse die Frequenzen dery
wo
x
ist 0 auch dazu beitragen, auf den Prüfstand stellen.Nehmen wir an, wir bilden die Kontingenz-Tabelle für
x
undy
:Sei n = a + b + c + d.... Dies ist die Anzahl der Proben (d.h. gleiche wie len(x) und len(y)).
Lassen nx = c + d.... Dies ist die Anzahl der vorkommen von
1
imx
.Lassen py1 = (b + d)/n. Dies ist der Teil der gesamten Bevölkerung, wobei y 1.
sklearn.feature_selection.chi2
führt ein chi2-test auf [c, d] mit der erwartetenWerte [(1-py1)*nx, py1*nx]. Dies ist nicht die gleiche wie die standard-Kontingenz-Tabelle
die Analyse einer 2x2-Tabelle.
Hier ist ein extremes Beispiel. Nehmen wir an, die 2x2-Kontingenz-Tabelle für
x
undy
istDen sklearn Berechnung erzeugt einen chi2-score von 1.58, mit einem p-Wert 0.208.
Die Kontingenz-Tabelle Analyse der
scipy.stats.chi2_contingency
gibt ein chi2-score von 18,6, mit einem p-Wert 1,60 e-5.InformationsquelleAutor Warren Weckesser
Uns Ihre Daten,
dies ist, was
feature_selection.chi2
berechnet:Diese sind die beobachteten feature Frequenzen pro Klasse, D. H. die Kontingenz-Tabelle. Dann werden die erwarteten Werte:
Schließlich, wird ein χ2-test:
Sind die Punktzahlen der entsprechenden bit: Sie sind für die Sortierung der Eigenschaften durch diskriminative Kraft. Beachten Sie, dass Sie bekommen eine Punktzahl und eine p-Wert pro feature.
sklearn.feature_selection.chi2
.Das Beispiel, das Sie gezeigt haben, kann aufgefasst werden als eine ZERLEGUNG einer solchen Tabelle in arrays übergeben werden
scipy.stats.chisquare
würde zu den gleichen Ergebnissen. Ich bin jedoch daran interessiert, bei der Beschaffung der original-R-x-C-Tabelle.Für standard-contingency table analysis, Ihre
expected
Arrays ist nicht korrekt. Das array der zu erwartenden Frequenzen müssen die gleichen marginalen Summen (d.h. Zeile und Spalte Summen) als array der beobachteten Frequenzen.Die
chisquare
docstring anderes vermuten lässt, sagen Sie, dass es falsch ist?Sorry, sollte ich einen längeren Kommentar geschrieben (oder kein Kommentar!). Ihre
expected
ist richtig für die Berechnung, erfolgt durchsklearn.feature_selection.chi2
. Wie gesagt, es ist nicht eine einzige chi2-test auf derobserved
Kontingenz-Tabelle (die ist in dem test war ich denken, wenn ich sagte, es war nicht richtig für "standard-contingency table analysis"). Ist es auch nicht tun, 2x2-Kontingenz-Tabelle Analyse pro Spalte. Ich denke, letzteres ist die Essenz von @tiao Frage.InformationsquelleAutor