Kaggle在《泰坦尼克号》上遇到一个介绍性的数据科学问题,其目的是在给定有关乘客(例如性别,年龄,舱位等)的一些信息的情况下,预测该乘客的生存机会。我使用Scikit Learn在Python中为此实现了一个简单的逻辑回归模型,并且我正在探索添加“ Age”变量的更高阶因子。我按照Scikit Learn网站上的说明使用了PolynomialFeatures:
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)
当我为年龄添加一个平方特征(即多项式2阶)时,我在训练集上的预测值的精度提高了1-2个百分点,但是当我将3阶作为上述代码时,精度实际上恢复为与线性情况相同(即度= 1)。从理论上讲,它应该稍微改善或保持与度= 2相同。对于所有较高的度,此行为也将继续。我对Scikit Learn非常陌生,对于我做错了什么,我将不胜感激。
最佳答案
添加更多变量时,精度不必提高或保持不变。添加更多功能会降低模型的准确性,这一事实说明了添加功能的重要性。
当向模型中添加新功能时,无论该功能在统计上是否有意义(即“可观”会影响模型结果),都将观察到模型中的变化较小。因此,一些所得系数(例如,R ^ 2)将增加。但是,模型准确性可能会下降,因为添加无关紧要的功能可能会对与新功能相关的现有解释变量的重要性产生负面影响。
您的示例:使用多项式特征时,必须始终对较高的度数保持谨慎。对于2度情况,由于结果与Age变量之间的关系变为二次关系,因此准确性提高了。但是,当您将度数增加到3时,会添加三次年龄,这是微不足道的功能。尽管由于微不足道而不能提高准确性,但由于与Age和Age square相关,它也会降低准确性。年龄平方(有效)和年龄立方(无关紧要)变量之间的相关性使年龄平方也无关紧要,因此降低了总体预测能力。
关于python - 在Scikit学习中拟合逻辑模型的同时使PolynomialFeatures无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37307883/