问题描述
我正在使用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 (将#修改为@)