【问题标题】:Cannot cast array data from dtype('float64') to dtype('int32') according to 'safe'无法根据“安全”将数组数据从 dtype('float64') 转换为 dtype('int32')
【发布时间】:2020-04-17 00:26:00
【问题描述】:

我有一个包含 6 列的数据集 'Weight'(float)、'Gender'(0 or 1 (int))、'Height'(float)、'Metabolism'(0,1,2,3 ( int)), 'Psychology'(0,1,2,3,4,5,6 (int)) 我们要预测的列是'Age'(int)。我必须使用 sklearn 的 VotingClassifier 来完成。应用 one-hot-encoding 后,我已经以这种方式拆分数据。

X_train, X_test, y_train, y_test = train_test_split(X_hot, y, test_size=0.25, random_state=1)

我将这 4 种算法用于分类器。

gbm = GradientBoostingRegressor(loss='huber',n_estimators=5000,max_features="sqrt",subsample=0.9)
gbm.fit(X = X_train,y = np.log1p(y_train))

ada = AdaBoostClassifier(n_estimators=2000)
ada.fit(X = X_train,y = y_train)

log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)

还有knn。现在,这部分完美运行

from sklearn.ensemble import VotingClassifier
estimators=[('knn', knn_best), ('ada', ada), ('log_reg', log_reg), ('gbm', gbm)]
new_ensemble = VotingClassifier(estimators, voting='hard')
new_ensemble.fit(X_train, y_train)

下面这部分是显示错误的地方

y_pred = new_ensemble.predict(X_test)

我尝试将所有内容转换为从 X_train、X_test、y_train、y_test 浮动,但它没有改变任何东西。我将所有内容都更改为 int 但同样的错误也发生了。为什么该行显示错误?我真的很困惑。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-37-86a04c2ceff1> in <module>
----> 1 y_pred = new_ensemble.predict(X_test)

~\AppData\Roaming\Python\Python37\site-packages\sklearn\ensemble\voting_classifier.py in predict(self, X)
    237                 lambda x: np.argmax(
    238                     np.bincount(x, weights=self._weights_not_none)),
--> 239                 axis=1, arr=predictions)
    240 
    241         maj = self.le_.inverse_transform(maj)

~\Anaconda3\lib\site-packages\numpy\lib\shape_base.py in apply_along_axis(func1d, axis, arr, *args, **kwargs)
    378     except StopIteration:
    379         raise ValueError('Cannot apply_along_axis when any iteration dimensions are 0')
--> 380     res = asanyarray(func1d(inarr_view[ind0], *args, **kwargs))
    381 
    382     # build a buffer for storing evaluations of func1d.

~\AppData\Roaming\Python\Python37\site-packages\sklearn\ensemble\voting_classifier.py in <lambda>(x)
    236             maj = np.apply_along_axis(
    237                 lambda x: np.argmax(
--> 238                     np.bincount(x, weights=self._weights_not_none)),
    239                 axis=1, arr=predictions)
    240 

TypeError: Cannot cast array data from dtype('float64') to dtype('int32') according to the rule 'safe'

【问题讨论】:

  • 相反,尝试将所有内容都转换为 int 吗?也许这应该可行。
  • 你能显示错误信息吗..full tr​​aceback
  • 我尝试将所有内容都转换为 int,我已经在上面提到过。我会在几分钟内更新完整的错误消息
  • (更新错误)

标签: python pandas numpy scikit-learn


【解决方案1】:

尝试将参数 voting='soft' 用于 VotingClassifier。我认为使用 voting='hard' 它需要所有模型的 整数标签,但会从回归器中获得一些 浮点值。使用“软”,它将模型结果作为概率,当然,概率是浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2018-08-15
    • 2021-01-26
    • 2019-03-11
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多