在Scikit Learn中拟合逻辑模型时,无法使PolynomialFeatures正常工作

时间:2016-05-18 18:50:37

标签: python scikit-learn

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的新手,我很欣赏任何有关我做错的见解。

1 个答案:

答案 0 :(得分:1)

添加更多变量时,准确性无需改善或保持不变。增加更多功能的事实是降低模型的准确性,这就是增加功能的重要性。

当一个新特征被添加到模型中时,无论它是否具有统计显着性(即"相当大的"影响模型结果),都会观察到模型中的变化较小。因此,一些结果系数(例如R ^ 2)将增加。但是,模型精度会下降,因为添加无关紧要的特征会对与新特征相关的现有解释变量的重要性产生负面影响。

您的示例:使用多项式要素时,必须始终谨慎使用更高的度数。对于2度情况,准确度增加,因为结果和Age变量之间的关系变成二次方。但是当你将度数增加到3时,会增加立方年龄,这是一个无关紧要的特征。虽然它不会因为微不足道而提高准确性,但由于与年龄和年龄相关,它也会降低准确性。 Age square(重要)和Age cube(无意义)变量之间的相关性使Age square也无关紧要,从而降低了整体预测能力。

相关问题