Scikit_learn 的具有逻辑回归的 PolynomialFeatures 导致得分较低

Scikit_learn's PolynomialFeatures with logistic regression resulting in lower scores

我有一个数据集 X,它的形状是 (1741, 61)。将逻辑回归与 cross_validation 结合使用,每次拆分(cv =5)我得到大约 62-65%。

我认为如果我将数据二次方化,精度应该会提高。但是,我得到了相反的效果(我让 cross_validation 的每个部分都在 40 年代,百分比方面)所以,我假设我在尝试制作数据时做错了什么二次?

这是我正在使用的代码,

from sklearn import preprocessing
X_scaled = preprocessing.scale(X)

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(3)
poly_x =poly.fit_transform(X_scaled)
classifier = LogisticRegression(penalty ='l2', max_iter = 200)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, poly_x, y, cv=5)

array([ 0.46418338,  0.4269341 ,  0.49425287,  0.58908046,  0.60518732])

这让我怀疑,我做错了什么。

我尝试将原始数据转换为二次方,然后使用 preprocessing.scale 缩放数据,但结果出错。

UserWarning: Numerical issues were encountered when centering the data and might not be solved. Dataset may contain too large values. You may need to prescale your features. warnings.warn("Numerical issues were encountered "

所以我没有费心走这条路。

另一件令人烦恼的事情是二次计算的速度。 cross_val_score 在使用多项式特征时需要大约几个小时来输出分数。有什么办法可以加快速度吗?我有一个英特尔 i5-6500 CPU 和 16 gigs 的 ram, Windows 7 OS.

谢谢。

您是否尝试过使用 MinMaxScaler 而不是 ScalerScaler 将输出大于和小于 0 的值,因此您将 运行 进入一种情况,其中缩放值为 -0.1 的值和值为 0.1 的值将具有相同的平方值,尽管根本不相似。直觉上,这似乎会降低多项式拟合的分数。话虽如此,我还没有测试过,这只是我的直觉。此外,要小心多项式拟合。我建议阅读 this answer to "Why use regularization in polynomial regression instead of lowering the degree?"。这是一个很好的解释,可能会向您介绍一些新技术。顺便说一句,@MatthewDrury 是一位优秀的老师,我建议阅读他的所有答案和博客文章。

有说法"the accuracy is supposed to increase"具有多项式特征。如果多项式特征使模型更接近原始数据生成过程,那是正确的。多项式特征,特别是使每个特征交互和多项式,可能会使模型远离数据生成过程;因此更差的结果可能是合适的。

通过在 scikit 中使用 3 次多项式,X 矩阵从 (1741, 61) 变为 (1741, 41664),这明显比行多。

41k+ 列将需要更长的时间来求解。您应该查看特征选择方法。正如 Grr 所说,研究降低多项式。尝试 L1、分组套索、RFE、贝叶斯方法。尝试 SME(可能能够识别可能是多项式的特定特征的主题专家)。绘制数据以查看哪些特征可能相互作用或在多项式中最好。

我有一段时间没看它了,但我记得关于层次结构良好的模型的讨论(你可以删除 x1 但保留 x1 * x2 交互)。如果您的模型在结构不当的分层模型中表现最佳,这可能值得研究。