Python Scikit 随机森林回归器错误

Posted

技术标签:

【中文标题】Python Scikit 随机森林回归器错误【英文标题】:Python Scikit Random Forest Regressor Error 【发布时间】:2012-12-23 07:12:16 【问题描述】:

我正在尝试从 csv 加载训练和测试数据,在 scikit/sklearn 中运行随机森林回归器,然后预测测试文件的输出。

TrainLoanData.csv 文件包含 5 列;第一列是输出,接下来的 4 列是特征。 TestLoanData.csv 包含 4 列 - 特征。

当我运行代码时,我得到错误:

    predicted_probs = ["%f" % x[1] for x in predicted_probs]
IndexError: invalid index to scalar variable.

这是什么意思?

这是我的代码:

import numpy, scipy, sklearn, csv_io //csv_io from https://raw.github.com/benhamner/BioResponse/master/Benchmarks/csv_io.py
from sklearn import datasets
from sklearn.ensemble import RandomForestRegressor

def main():
    #read in the training file
    train = csv_io.read_data("TrainLoanData.csv")
    #set the training responses
    target = [x[0] for x in train]
    #set the training features
    train = [x[1:] for x in train]
    #read in the test file
    realtest = csv_io.read_data("TestLoanData.csv")

    # random forest code
    rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)
    # fit the training data
    print('fitting the model')
    rf.fit(train, target)
    # run model against test data
    predicted_probs = rf.predict(realtest)
    print predicted_probs
    predicted_probs = ["%f" % x[1] for x in predicted_probs]
    csv_io.write_delimited_file("random_forest_solution.csv", predicted_probs)

main()

【问题讨论】:

【参考方案1】:

首先,拥有示例数据来重现和调试您的问题总是有帮助的。如果它们太大或太隐秘,您可以提取其中有趣的部分。

变量predicted_probs 的内容似乎与您预期的不一样。它似乎是一个整数列表(或数组),这也是我所期望的。

在 sklearn 中,X.train() 方法总是获取训练数据及其对应的类(通常是整数或字符串)。然后X.predict() 方法只接受验证数据并返回预测结果,即,对于验证数据中的每一组,一个类(同样是整数或字符串)。

如果你想知道经过训练的分类器的准确率有多好,你不能只训练和预测,还必须进行交叉验证,即反复训练和验证,每次检查有多少预测是正确的。 sklean 有一个很好的文档,我相信你会找到相应的部分。如果没有,问我。

【讨论】:

实际上,predict 的结果是一个浮点数组。 RandomForestRegressor 是回归模型,而不是分类器。【参考方案2】:

RandomForestRegressor 的返回值是一个浮点数组:

In [3]: rf = RandomForestRegressor(n_estimators=10, min_samples_split=2, n_jobs=-1)

In [4]: rf.fit([[1,2,3],[4,5,6]],[-1,1])
Out[4]: 
RandomForestRegressor(bootstrap=True, compute_importances=False,
           criterion='mse', max_depth=None, max_features='auto',
           min_density=0.1, min_samples_leaf=1, min_samples_split=2,
           n_estimators=10, n_jobs=-1, oob_score=False,
           random_state=<mtrand.RandomState object at 0x7fd894d59528>,
           verbose=0)

In [5]: rf.predict([1,2,3])
Out[5]: array([-0.6])

In [6]: rf.predict([[1,2,3],[4,5,6]])
Out[6]: array([-0.6,  0.4])

所以你试图索引像(-0.6)[1] 这样的浮点数,这是不可能的。

附带说明,该模型不返回概率。

【讨论】:

【参考方案3】:

尝试使用 numpy 的“genfromtxt”而不是“csv_io.read_data”来加载数据集 - 它会自动将 csv 中的数据转换为 numpy 数组。并且阅读Getting Started With Python For Data Science 文章会对你有用...

【讨论】:

以上是关于Python Scikit 随机森林回归器错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

理解 scikit 学习预测的随机森林内存需求

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

如何在 Python 中使用随机森林回归器预测未来的数字

随机森林回归器 - Python 不可重现

偏移随机森林分类器 scikit 学习