Kaggle有一个关于泰坦尼克号的介绍性数据科学问题,目标是预测乘客的生存机会,并给出一些关于他/她的信息(例如性别、年龄、客舱等级等)。我使用Scikit Learn在Python中实现了一个简单的逻辑回归模型,我正在探索添加"年龄"变量的更高阶因子。我按照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)将增加。然而,模型的准确性可能会下降,因为添加不重要的特征会对与新特征相关的现有解释变量的显著性产生负面影响。
您的示例:当您使用多项式特征时,您必须始终谨慎使用更高阶。对于二阶病例,由于结果和年龄变量之间的关系是二次型的,因此准确性提高了。但是,当将度数增加到3时,会添加"三次年龄",这是一个无关紧要的特征。虽然它不会因为微不足道而提高准确性,但也会因为与年龄和年龄平方相关而降低准确性。年龄平方(显著)和年龄立方体(不显著)变量之间的相关性使年龄平方也不显著,从而降低了整体预测能力。