如何让scikit学习找到简单的非线性关系

fel*_*lix 3 machine-learning pandas 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)
Run Code Online (Sandbox Code Playgroud)

这给

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

cfh*_*cfh 5

您应该可以使用随机森林回归轻松地获得合适的拟合度,而无需任何预处理,因为它是一种非线性方法:

model = RandomForestRegressor(n_estimators=10, max_features=2)
model.fit(features, labels)
Run Code Online (Sandbox Code Playgroud)

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


Don*_*beo 2

解决方案并不那么容易,并且可能会受到数据的影响很大。

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

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

Sklearn 不实现神经网络,因此您应该使用 pybrain 或 fann。

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

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

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