Ähnlich wie bei der linearen Regression, wird jedoch verwendet, wenn die Zielvariable binär ist. Zum Beispiel, ob diese Person ein Produkt kauft oder nicht, ob sie einen Stock trifft oder nicht, ob sie sich bewegt oder nicht, ob sie den Job wechselt oder nicht und so weiter.
Erstellen Sie ein Vorhersagemodell mit der folgenden logistischen Funktion (Sigmoid-Funktion).
Die Form der Logistikfunktion ist wie folgt. Es nimmt einen Wert von 0 bis 1 an und steigt monoton an.
Die Beziehung zwischen der Zielvariablenmatrix x und der erklärenden Variablen y ist wie folgt. (Die rechte Seite von y = ax + b entspricht der Potenz -1.)
Verwenden Sie Affair-Daten mit sklearn.
{get_affair_dataset.py}
from sklearn.linear_model import LogisticRegression #Zur logistischen Regression
from sklearn.cross_validation import train_test_split #Zur Aufteilung der Kreuzvalidierung
import statsmodels.api as sm
df = sm.datasets.fair.load_pandas().data #Laden von Affair-Daten
{describe_affair.py}
df.head()
rate_marriage: Glück, Alter: Alter, Jahre_verheiratet: Ehejahre, Kinder: Anzahl der Kinder, religiös: Glaube, Bildung: akademischer Abschluss, Beruf: Beruf der Frau, Beruf_husb: Beruf des Ehemanns, Angelegenheiten: Affärenerfahrung (größer als 0) Had_Affair: Affair-Flag (1 wird gesetzt, wenn die Affäre 0 ist>)
{easy_display1.py}
#Alter und Anwesenheit der Affäre
sns.countplot('age', data = df.sort('age'), hue = 'Had_Affair', palette='coolwarm')
{easy_display2.py}
#Jahre der Ehe und Anwesenheit oder Abwesenheit von Affäre
sns.countplot('yrs_married', data = df.sort('yrs_married'), hue = 'Had_Affair', palette='coolwarm')
{easy_display3.py}
#Anzahl der Kinder und Vorhandensein oder Nichtvorhandensein einer Affäre
sns.countplot('children', data = df.sort('children'), hue = 'Had_Affair', palette='coolwarm')
Die Affärenrate ist höher, wenn Sie älter werden / mehr Jahre verheiratet sind / Kinder haben
Zuvor ist die Belegungsvariable eine kategoriale Variable. Ersetzen Sie sie daher durch eine Dummy-Variable. Eine kategoriale Variable ist eine Variable, bei der die Größe des Werts bedeutungslos ist.
{change_dummy_value.py}
#numpy bekommen_Mit Dummies in Dummy-Variable konvertieren.
occ_dummies = pd.get_dummies(df.occupation)
hus_occ_dummies = pd.get_dummies(df.occupation_husb)
#Spaltenname festgelegt
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']
occ_dummies.head()
Mit dem obigen Gefühl wird der Treffer von Occ1 bis 6 durch das 0,1-Flag ersetzt.
Als nächstes erhalten Sie die erklärenden Variablen.
{get_x.py}
#Setzen Sie X, wobei Beruf, Beruf des Ehemanns und Familienstand aus dem ursprünglichen Datenrahmen entfernt wurden.
X = df.drop(['occupation', 'occupation_husb', 'Had_Affair'], axis =1)
#Bereiten Sie einen Datenrahmen vor, in dem Berufe in Dummy-Variablen konvertiert werden
dummys = pd.concat([occ_dummies, hus_occ_dummies], axis =1)
#Kombinieren Sie den variablen Datenrahmen des Besatzungsdummy mit dem Datenrahmen, wobei der Beruf usw. gelöscht wurde
X = pd.concat([X, dummys], axis=1)
X.head()
Bisheriger Datensatz für erklärende Variablen
Wenn eine erklärende Variable eine oder mehrere andere erklärende Variablen darstellen kann, spricht man von mehrfacher Co-Linearität. Zum Beispiel wird dieses Mal occ1 eindeutig durch die Werte von occ2 bis occ6 bestimmt. (Wenn es in occ2-6 eine oder mehrere Einsen gibt, ist occ1 = 0, andernfalls ist occ1 = 1) In diesem Fall kann die inverse Matrix nicht berechnet werden, oder selbst wenn sie berechnet werden kann, wird die Zuverlässigkeit des erhaltenen Ergebnisses gering. Um dies zu beseitigen, löschen Sie occ1 und hocc1.
{drop_nonavailable_value.py}
X = X.drop('hocc1', axis = 1)
X = X.drop('hocc1', axis = 1)
#Da Angelegenheiten zum Erstellen der Zielvariablen verwendet werden, wird dies auch von den erklärenden Variablen ausgeschlossen.
X = X.drop('affairs', axis =1 )
X.head()
Endgültige Form
{do_logistic_regression.py}
#Objektiver Variablensatz
Y = df.Had_Affair
Y = np.ravel(Y) # np.Machen Sie Y zu einem eindimensionalen Array mit Ravel
#Ausführung der logistischen Regression
log_model = LogisticRegression() #Instanzgenerierung
log_model.fit(X, Y) #Ausführung der Modellerstellung
log_model.score(X, Y) #Bestätigung der Genauigkeit der Modellvorhersage(72.6%)
> 0.7260446120012567
Überprüfen Sie den Koeffizienten jeder Variablen
{confirm_coefficient.py}
#Von der Instanz.coef_[0]Enthält den Koeffizienten
coeff_df = DataFrame([X.columns, log_model.coef_[0]]).T
coeff_df
Der Ort, an dem dieser Koeffizient groß ist, hat großen Einfluss. Da die Dateneinheiten der erklärenden Variablen jedoch nicht einheitlich sind, ist es nicht möglich, sie einfach nebeneinander zu vergleichen. Zum Beispiel ist occ5 ungefähr neunmal so groß wie yrs_married, daher ist es nicht einfach, OK zu sagen !!, ohne die Anzahl der Ehejahre zu berücksichtigen.
Wie üblich werde ich schreiben, wie man es in Zug und Test unterteilt.
{do_logistic_regression_train_test.py}
#Datenvorbereitung für Zug und Test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y)
log_model2 = LogisticRegression()
log_model2.fit(X_train, Y_train) #Modellerstellung mit Zugdaten
class_predict = log_model2.predict(X_test) #Testdaten vorhersagen
from sklearn import metrics #Zur Überprüfung der Vorhersagegenauigkeit
metrics.accuracy_score(Y_test, class_predict) #Genauigkeitsprüfung
>0.73115577889447236
Sie können sehen, dass die Genauigkeit etwa 73% beträgt.
Recommended Posts