【问题标题】:RandomeForestRegressor - unhashable type: 'Int64Index' errorRandomeForestRegressor - 不可散列的类型:“Int64Index”错误
【发布时间】:2018-01-10 15:24:53
【问题描述】:

我正在拟合一个模型来使用Python 中的RandomForestRegressor 中的RandomForestRegressor 来预测真值three column dataset(单击链接下载完整的CSV-dataset,格式如下

t_stamp,X,Y
0.000543,0,10
0.000575,0,10
0.041324,1,10
0.041331,2,10
0.041336,3,10
0.04134,4,10
0.041345,5,10
0.04135,6,10
0.041354,7,10

这是我们如何进行预测的。

import pandas as pd
import numpy as np
import glob, os
from io import StringIO
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.metrics import accuracy_score
import math
from math import sqrt
from sklearn.cross_validation import train_test_split

df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "data.csv"))))

for i in range(1,10):
    df['X_t'+str(i)] = df['X'].shift(i)

print(df)

df.dropna(inplace=True)

X = pd.DataFrame({ 'X_%d'%i : df['X'].shift(i) for i in range(10)}).apply(np.nan_to_num, axis=0).values
y = df['Y'].values

train_index, test_index = train_test_split(df.index, test_size=0.40)

X_train = df.X[[train_index]]
y_train = df.Y[[train_index]]
X_test = df.X[[test_index]]
y_test = df.Y[[test_index]]


#X_train = df.X[train_index].values
#y_train = df.Y[train_index].values
#X_train = df.X[test_index].values
#y_test = df.Y[test_index].values


#X = X[:, None]
#y = df['Y'][:, None]
print(X.shape)
print(df['Y'].shape)

print()
print("Size of X_train:",(len(X_train)))
print("Size of Y_train:",(len(X_train)))
print("Size of X_test:",(len(X_test)))
print("Size of Y_test:",(len(y_test)))

print()
reg = RandomForestRegressor(criterion='mse')
reg.fit(X_train,y_train)

但是,当我执行 reg.fit(X_train,y_train) 时 - 我收到此错误

    raise TypeError("unhashable type: %r" % type(self).__name__)

TypeError: unhashable type: 'Int64Index'

我们如何解决这个问题?

提前致谢。

【问题讨论】:

  • 为什么注释掉.values代码?这似乎是正确的。
  • 在这种情况下,我们将得到另一个错误"number of samples=%d" % (len(y), n_samples)) ValueError: Number of labels=155113 does not match number of samples=1,当我们分别执行print(X_train.shape)print(y_train.shape) (103410,)(155113,) 时。
  • 您是否尝试过将您的火车测试拆分更改为:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)

标签: python python-3.x pandas numpy random-forest


【解决方案1】:

我认为这里的问题是您的火车测试拆分不正确。您可以让训练测试拆分输出 4 个新对象,X_train、X_test、y_train 和 y_test,就像您在代码中拆分后尝试应用一样。我会像这样设置你的数据:

X = df.drop('Y', axis=1)
y = df['Y']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)

然后您就可以将这些应用到您的模型中。

【讨论】:

  • 但是当我尝试fig, ax = plt.subplots() #df.plot(x='time', y='Y', ax=ax) ax.plot(df['time'].values, df['Y'].values) ax.plot(df['time'].values, modelPred_test)时,这给了我另一个错误raise ValueError("x and y must have same first dimension") ValueError: x and y must have same first dimension
  • 虽然这是 matplotlib 的一个错误,但在您给出的示例代码的原始问题中,这些都不是。如果我猜测,我会说 df['time'].values 与 modelPred_test 的长度不同(不管是什么。)
  • 您需要将其添加到您的代码中(例如,创建 modelPred_test 的位置)或提出一个新问题,您需要查看 modelPred_test 的形状,记住您已经拆分了您的数据集输出到原始 df 的 40% 的测试集中,因此测试数据的大小显然不会与原始数据集相同。
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2017-03-11
  • 1970-01-01
  • 2017-12-27
  • 2019-01-07
  • 2018-04-24
相关资源
最近更新 更多