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

时间:2017-04-17 18:14:52

标签: machine-learning scikit-learn logistic-regression polynomials

我有一个数据集X,其形状为(1741,61)。使用带有交叉验证的逻辑回归,每次拆分我得到62-65%左右。(cv = 5)。

我认为如果我将数据设为二次方,那么准确度应该会提高。然而,我得到了相反的效果(我将每次交叉验证的分裂都放在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需要大约几个小时来输出分数。有什么方法可以加快速度吗?我有一台intel i5-6500 CPU,有16台ram,Windows 7操作系统。

谢谢。

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用2代替MinMaxScalerScaler将输出高于和低于0的值,因此您将遇到这样的情况:值为-0.1的值和值为0.1的值将具有相同的平方值,尽管不是真的存在完全相似。直觉上,这似乎会降低多项式拟合的分数。话虽如此,我还没有测试过,这只是我的直觉。此外,请注意多项式拟合。我建议阅读this answer to "Why use regularization in polynomial regression instead of lowering the degree?"。这是一个很好的解释,可能会向您介绍一些新技术。另外@MatthewDrury是一位优秀的老师,我建议阅读他的所有答案和博客文章。

答案 1 :(得分:1)

有一个声明表明"准确性应该增加"具有多项式特征。如果多项式特征使模型更接近原始数据生成过程,则确实如此。多项式特征,特别是使每个特征相互作用和多项式,可以使模型从数据生成过程进一步移动;因此,更糟糕的结果可能是合适的。

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

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

我有一段时间没有看过它,但我记得有关分层次精心设计的模型的讨论(你可以删除x1但是保持x1 * x2的交互)。如果你的模型在一个不合理的分层模型中表现得最好,这可能是值得研究的。