如何让scikit学会发现简单的非线性关系

时间:2014-03-07 16:58:15

标签: pandas machine-learning scikit-learn

我在pandas数据框中有一些数据(虽然pandas不是这个问题的重点)。作为实验,我将列ZR作为列Z除以列R.作为使用scikit的第一步学习我想看看是否可以从其他列预测ZR(这应该是可能的,因为我刚从R和Z制作它) 。我的步骤已经过了。

columns=['R','T', 'V', 'X', 'Z']
for c in columns:
    results[c] = preprocessing.scale(results[c]) 
results['ZR'] = preprocessing.scale(results['ZR'])
labels = results["ZR"].values
features = results[columns].values
#print labels
#print features
regr = linear_model.LinearRegression()
regr.fit(features, labels)
print(regr.coef_)
print np.mean((regr.predict(features)-labels)**2)

这给出了

[ 0.36472515 -0.79579885 -0.16316067  0.67995378  0.59256197]
0.458552051342
  1. 预处理似乎是错误的,因为它破坏了我认为的Z / R关系。在这种情况下预处理的正确方法是什么?
  2. 有没有办法达到100%准确度?线性回归是错误的工具,因为关系不是线性的。
  3. 这五项功能在我的数据中高度相关。在scikit中实现的非负最小二乘法学习吗? (我可以在邮件列表中看到它,但不是文档。)我的目标是尽可能多地将系数设置为零。

2 个答案:

答案 0 :(得分:4)

你应该能够轻松地使用random forest regression获得合适的体积,而无需任何预处理,因为它是一种非线性方法:

model = RandomForestRegressor(n_estimators=10, max_features=2)
model.fit(features, labels)

您可以使用参数来获得更好的性能。

答案 1 :(得分:1)

解决方案并不容易,并且会受到数据的影响。

如果你的变量R和Z是有界的(for ex 0<R<1 -3<Z<2)那么你应该能够使用神经网络对输出变量进行很好的估计。

使用神经网络,即使不预处理数据并使用所有变量作为输入,您也应该能够估计输出。
(当然,你必须解决最小化问题)。

Sklearn没有实现神经网络所以你应该使用pybrain或fann。

如果您想对数据进行预处理以简化最小化问题,可以尝试从预测矩阵中提取正确的特征。

我认为没有很多非线性特征选择工具。我会尝试按以下顺序估算数据集中的重要变量: 1-套索 2-稀疏的PCA 3-决策树(您实际上可以使用它们进行功能选择)但我会尽可能地避免这种情况

如果这是一个玩具问题,我建议你转向更标准的东西。 你可以在谷歌上找到很多例子。