如何处理sklearn中的得分方法?

时间:2016-07-16 17:28:18

标签: python scikit-learn

这是我之前的问题How to convert a groupby().mean() into a callable object?

的扩展

我很感谢我从这个论坛得到的帮助,特别是Alberto Garcia-Raboso回答了我关于这个模型的问题。

随着我的继续,会发生更多错误。这个似乎很难纠正。它是关于模型的性能评估。我试图使用.score(pred_values,real_values),但错误表明输入值不在[index]中:

KeyError: 'None of [[87.333333333333329, 76.0, 81.5, 87.333333333333329, 87.333333333333329, 76.0, 81.5]] are in the [index]'

我不知道如何解释这一点。索引在哪里以及如何访问它并解决问题?

我一直在思考这个问题。当我再试一次时,我仍然无法解决问题。我将不胜感激任何帮助。谢谢。

模型

from sklearn.base import BaseEstimator, ClassifierMixin
import pandas as pd
import numpy as np

class MeanClassifier(BaseEstimator, ClassifierMixin):
    def __init__(self):
        pass

    def fit(self, X, y):
        self.name = X
        self.scores = y
        self.data = pd.DataFrame({"name": self.name, "score": self.scores})
        #print(self.data)
        self.means = self.data.groupby(["name"]).mean()
        #print(self.means)
        return self

    def predict(self, X):
        return list(self.means.loc[X, 'score'])

数据输入和模型测试

names = ["John", "Mary", "Suzie", "John", "John", "Mary", "Suzie"]
scores = [80, 70, 75, 90, 92, 82, 88]
dd = pd.DataFrame({"name": names, "score": scores})

ddnames = list(dd['name'])
ddscores = list(dd['score'])

B = MeanClassifier()
Bfit = B.fit(ddnames, ddscores)

Bpred = B.predict(dd['name'])
#print(Bpred)

print(B.score(Bpred, ddscores))  #The error appears here

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题...第一个问题是使用score方法。

得分的功能定义如 -

  

得分(X,y [,sample_weight])

仅提及score在后​​端调用predict本身。

其中X是您的要素集,y是您的真实数据。你提供的是预测列表和真实列表。因此,将该行更改为 -

print(B.score(ddnames, ddscores))

但是如果你运行它,你会得到另一个错误 -

  

无法处理多类和连续的混合

您收到此错误的原因是您继承ClassifierMixin并执行回归任务。所以简单来说,你给出了连续输出,但classifiermixin认为它是一个分类问题。

所以只需继承RegressorMixin就可以了。

#left code#
from sklearn.base import BaseEstimator, RegressorMixin
class MeanClassifier(BaseEstimator, RegressorMixin):
def __init__(self):
    pass
#left code#

print(B.score(ddnames, ddscores))  

输出 -

0.395607701564