【问题标题】:Voting Classifier causing casting Numpy Type Error投票分类器导致转换 Numpy 类型错误
【发布时间】:2020-01-20 13:33:39
【问题描述】:

我正在投票分类器中尝试使用几个 sklearn 分类器进行集成。

为了进行测试,我有一个数据框,其中包含一组表示工具技能的列(一个从 0 到 10 的数值,表示人们对技能的了解程度)和一个作为类变量的“适合工作”列。示例:

import pandas as pd
df = pd.DataFrame(columns=["Python", "Scikit-learn", "Pandas", "Fit to Job"])
total_mock_samples= 100
for i in range(total_mock_samples):
    df=df.append(mockResults(df.columns, 'Fit to Job', good_values=i > total_mock_samples/2), ignore_index=True)

#Fills dataframe with mock data
#Output like:
print(np.array(df))
#[[1. 3. 6. 1.]
# [3. 2. 3. 0.]
# [1. 4. 0. 0.]
# ...
# [7. 8. 8. 1.]
# [8. 7. 9. 1.]]

然后我安装我的集成分类器:

from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
import numpy as np

X = np.array(df[df.columns[:-1]])
y = np.array(df[df.columns[-1]])
rfc = RandomForestClassifier(n_estimators=10)
svc = SVC(kernel='linear')
knn = KNeighborsClassifier(n_neighbors=5)
nb = GaussianNB()
lr = LinearRegression()

ensemble = VotingClassifier(estimators=[("Random forest", rfc), ("KNN",knn), ("Naive Bayes", nb), ("SVC",svc), ("Linear Reg.",lr)])

最后,我尝试使用交叉验证对其进行评估,如下所示:

cval_score = cross_val_score(ensemble, X, y, cv=10)

但我收到以下错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-13-f7c01fa872d2> in <module>
    182 ensemble = VotingClassifier(estimators=[("Random forest", rfc), ("KNN",knn), ("Naive Bayes", nb), ("SVC",svc), ("Linear Reg.",lr)])
    183 
--> 184 cval_score = cross_val_score(ensemble, X, y, cv=10)
[...]

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

我检查了其他答案,但它们都指的是 numpy 数据转换。错误发生在交叉验证阶段。我尝试应用他们的解决方案,但没有成功。

我还尝试在计算分数之前更改数据类型,但没有成功。

也许有人有更敏锐的眼光,能看出问题出在哪里。

编辑 01:模拟结果生成器函数

def mockResults(columns, result_column_name='Fit', min_value = 0, max_value=10, good_values=False):
    mock_res = {}
    for column in columns:
        mock_res[column] = 0
        if column == result_column_name:
            if good_values == True:
                mock_res[column] = float(1)
            else:
                mock_res[column] = float(0)
        elif good_values == True:
            mock_res[column] = float(random.randrange(int(max_value*0.7), max_value))
        else:
            mock_res[column] = float(random.randrange(min_value, int(max_value*0.5)))
    return mock_res

【问题讨论】:

  • 您的数据是否有任何nan 值?如果没有,你可以先试试df = df.astype(int)?
  • @QuangHoang 我在没有nan 值的示例数据上尝试了该方法,但它不起作用,即使将 X 和 y 转换为带有 .astype 的 int 也是如此。
  • 您的代码在df = pd.DataFrame(np.random.randint(0,10,(100,10))) 下运行良好。
  • 本着最小可重现示例的精神 - 这也是调试过程的一部分 - 知道错误会在简单的 .predict 上重现,而不仅仅是在 cross_val_score 上 - 所以这不是问题
  • @TiagoDuque 如果我从 VotingClassifier() 中删除 LinearRegression 或者将其更改为 LogisticRegression(),它可以正常工作。

标签: python pandas numpy machine-learning scikit-learn


【解决方案1】:
df = pd.DataFrame(columns=["Python", "Scikit-learn", "Pandas", "Fit to Job"], data=np.random.randint(1, 10,size=(400,4)))    

class LinearRegressionInt(LinearRegression):
    def predict(self,X):
        predictions = self._decision_function(X)

        return np.asarray(predictions, dtype=np.int64).ravel()
... 
lr = LinearRegressionInt()
...

ensemble = VotingClassifier(estimators=[("lr",lr),("Random forest", rfc), ("KNN",knn), ("Naive Bayes", nb), ("SVC",svc)] )

cval_score = cross_val_score(ensemble, X, y, cv=10)
cval_score

array([ 0.09090909,  0.11904762,  0.17073171,  0.14634146,  0.17073171,
    0.15384615,  0.07692308,  0.15384615,  0.10810811,  0.08108108])

参考:An Typeerror with VotingClassifier

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多