2016-05-18 3 views
1

Kaggle hat ein einleitendes datenwissenschaftliches Problem auf der Titanic, wo das Ziel ist, die Überlebenschancen eines Passagiers vorherzusagen, einige Informationen über ihn/sie gegeben Geschlecht, Alter, Kabinenklasse usw.). Ich habe dazu ein einfaches logistisches Regressionsmodell in Python mit Scikit Learn implementiert, und ich untersuchte gerade das Hinzufügen von Faktoren mit höherem Grad der Variable "Age". Ich benutzte PolynomialFeatures gemäß den Anweisungen auf Website Scikit Learn:Schwierigkeiten, PolynomialFeatures zu erhalten, während ein logistisches Modell in Scikit passt Learn

import pandas as pd 
from sklearn import linear_model 
import numpy as np 
from sklearn import preprocessing 
from sklearn.preprocessing import PolynomialFeatures 

# Import titanic data 
titanic = pd.read_csv("train.csv") 

# Set the training set as 70% of the dataset and cross_validation set as remaining 30% 
predictors = ["Age"] 
training_set = titanic[predictors].iloc[range(0,int(titanic.shape[0]*0.7)),:] 
cv_set = titanic[predictors].iloc[range(int(titanic.shape[0]*0.7),titanic.shape[0]),:] 
training_actuals = titanic["Survived"].iloc[range(0,int(titanic.shape[0]*0.7))] 
cv_actuals = titanic["Survived"].iloc[range(int(titanic.shape[0]*0.7),titanic.shape[0])] 

# Create polynomial features 
poly = PolynomialFeatures(degree=3) 
training_set = poly.fit_transform(training_set) 
cv_set = poly.fit_transform(cv_set) 

# Fit a logistic regression model, predict values for training and cross-validation sets 
alg = linear_model.LogisticRegression() 
alg.fit(training_set, training_actuals) 
cv_predictions = alg.predict(cv_set) 
training_predictions = alg.predict(training_set) 

# Measure and print accuracy of prediction over both training and cross-validation sets 
cv_accuracy = len(cv_predictions[cv_predictions == np.array(cv_actuals)])/float(len(cv_predictions)) 
print "Prediction accuracy on cross-validation set is %s%%" % (cv_accuracy * 100) 
training_accuracy = len(training_predictions[training_predictions == np.array(training_actuals)])/float(len(training_predictions)) 
print "Prediction accuracy on training set is %s%%" % (training_accuracy * 100) 

Meine Genauigkeit der vorhergesagten Werte über den Trainingssatz verbessert 1-2 Prozentpunkte, wenn ich ein Quadrat-Funktion für das Alter (dh Polynomgrad 2) hinzufügen, aber Wenn ich den Grad 3 mache, wie im obigen Code, kehrt die Genauigkeit tatsächlich zum selben wie für den linearen Fall zurück (dh Grad = 1). Theoretisch sollte es sich leicht verbessern oder gleich bleiben wie bei Grad = 2. Dieses Verhalten gilt auch für alle höheren Stufen. Ich bin sehr neu in Scikit Learn, und ich würde mich über jeden Einblick freuen, was ich falsch mache.

+0

"** Theoretisch ** sollte es verbessern ..." - Sie meinen ** intuitiv ** Sie glauben, es sollte sich verbessern. Es ist wichtig, die beiden nicht zu verwirren :) –

Antwort

1

Die Genauigkeit muss nicht verbessert werden oder gleich bleiben, wenn weitere Variablen hinzugefügt werden. Die Tatsache, dass das Hinzufügen weiterer Funktionen die Genauigkeit des Modells verringert, spricht für die Geringfügigkeit zusätzlicher Funktionen. Wenn ein neues Merkmal zum Modell hinzugefügt wird, ob es statistisch signifikant ist (d. H. "Beträchtlich" beeinflusst das Modellergebnis) oder nicht, wird eine geringere Variation im Modell beobachtet. Daher werden einige der resultierenden Koeffizienten (z.B. R^2) zunehmen. Die Genauigkeit des Modells kann jedoch abnehmen, da das Hinzufügen von unbedeutenden Merkmalen die Bedeutung vorhandener erklärender Variablen, die mit dem neuen Merkmal korreliert sind, negativ beeinflussen kann.

Ihr Beispiel: Wenn Sie die polynomialen Funktionen verwenden, müssen Sie bei höheren Graden immer vorsichtig sein. Für den Fall 2. Grades ist die Genauigkeit erhöht, da sich die Beziehung zwischen dem Ergebnis und der Age-Variable als quadratisch erweist. Aber wenn Sie den Grad auf 3 erhöhen, wird das kubische Alter hinzugefügt, was ein unbedeutendes Merkmal ist. Während es die Genauigkeit nicht verbessert, weil es unbedeutend ist, verringert es es auch, weil es mit dem Quadrat von Alter und Alter korreliert ist. Die Korrelation zwischen Age-Quadrat- (signifikant) und Age-Cube-Variablen (unbedeutend) macht das Age-Quadrat ebenfalls bedeutungslos, wodurch die gesamte Vorhersagekraft verringert wird.

Verwandte Themen