我有一个数据集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操作系统。
谢谢。
答案 0 :(得分:1)
您是否尝试过使用2
代替MinMaxScaler
? Scaler
将输出高于和低于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的交互)。如果你的模型在一个不合理的分层模型中表现得最好,这可能是值得研究的。