用于监督分类的自定义损失或评分功能

问题描述

我正在使用scikit-learn构建一个分类器,该分类器接收输入x(大小为784的向量,该向量为28x28图像,表示从0到9的手写数字),并预测图像上存在的数字。我不想使用传统的准确性,而是希望算法对来自{5,6,7,7,8,9}的数字被预测为{0,1,2,3,4}的情况进行惩罚。

据我了解,无法更改sklearn分类器的损失函数,因此我尝试更改通过GridSearchCV调整超参数所使用的评分函数。这是我编写的自定义评分功能:

def loss_fn(y_true,y_pred):
    loss_score = 0
    N = len(y_true)
    
    for i in range(N):
        if y_true[i] != y_pred[i]:
            if int(y_true[i]) >= 5 and int(y_pred[i]) < 5:
                loss_score += 2
            else:
                loss_score += 1
    return (1-1/N*loss_score)

这是一个非常幼稚的函数,当分类器将{5,6,7,8,9}中的一个数字预测为{0,1,2,3,4}时为1,占2。一个“正常”错误。

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier() 
param_grid = {
    'n_estimators': [600,800,1000,1200],'max_features': ['auto','sqrt','log2']
}
custom_scorer = make_scorer(loss_fn)
clf = GridSearchCV(rfc,param_grid,cv=3,scoring = custom_scorer)
clf.fit(X_train,y_train)

print('Returned hyperparameter: {}'.format(clf.best_params_))
print('Best classification accuracy in train is: {}'.format(clf.best_score_))
print('Classification accuracy on test is: {}'.format(clf.score(X_test,y_test)))

实际上,当我使用自定义函数并尝试对测试数据集进行分类时,我又从{5、6、7、8、9}中得到了一位数字,预计是来自{0、1、2、3、4比没有任何自定义功能的结果要多。因此,它根本不起作用,我想知道为什么...

我的自定义评分功能太幼稚了吗?我在执行中犯了错误吗? 是否由于更改评分函数几乎没有什么不同而导致结果缺乏,从而使训练算法所依据的损失函数保持不变? 我应该在param_grid中添加更多参数吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...