鱼C论坛

 找回密码
 立即注册
查看: 2280|回复: 4

[技术交流] 机器学习系列------迷糊矩阵验证

[复制链接]
发表于 2018-6-13 06:08:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        今天接着昨天的代码继续写:
from sklearn.model_selection import cross_val_score

cross_val_score(sgd_clf,X_train,y_train_5,cv=3,scoring="accuracy")
        这是一种验证简写方法,运行后跟昨天的得分一样,结果为:
array([ 0.93895,  0.9566 ,  0.9663 ])
        看起来这个得分很高,都快接近1了。其实还不行,不信我们自己瞎编一个预测方法:
from sklearn.base import BaseEstimator

class Never5Classifier(BaseEstimator):
    def fit(self,X,y=None):
        pass
    def predict(self,X):
        return np.zeros((len(X),1),dtype=bool)
    
never_5_clf=Never5Classifier()
cross_val_score(never_5_clf,X_train,y_train_5,cv=3,scoring="accuracy")
        这个预测方法实际上就返回一个全是false的矩阵,无论猜任何数都不是5,我们看看他的评分:
array([ 0.9094 ,  0.90735,  0.9122 ])
        这是因为5在所有数据里只占10%,就算全错也有90%的准确率,所以我们要使用迷糊矩阵的方式验证:
from sklearn.model_selection import cross_val_predict

y_train_pred=cross_val_predict(sgd_clf,X_train,y_train_5,cv=3)
        以上代码作用是先创造一个跟原来的预测方法一样的数据格式,然后我们使用迷糊矩阵来验证一下:
from sklearn.metrics import confusion_matrix

confusion_matrix(y_train_5,y_train_pred)
        输出结果为:
array([[54208,   371],
       [ 2392,  3029]], dtype=int64)
        这就是一个方形矩阵,从左到右对角线上的数代表是正确的数量,数越大越好,如果正确率100%就像这样:
array([[54579,   0],
       [ 0,  5421]], dtype=int64)
        通常我们用另一种方法,就是取事先算好的迷糊矩阵的正确和总数的比值:
from sklearn.metrics import precision_score,recall_score
precision_score(y_train_5,y_train_pred)
        输出为:
0.89088235294117646
        其实就是 2392/371+3029,正确率还是挺高的,还有另外一种:
recall_score(y_train_5,y_train_pred)
        输出为:
0.55875299760191843
        这种是除以底下的2个数相加,然后还有一种方法:
from sklearn.metrics import f1_score

f1_score(y_train_5,y_train_pred)
        输出为:
0.68677020745947182
        这其实就是综合了上面2项验证,取一个误差值。公式是2*前两项相乘/前两项相加。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-13 07:57:48 | 显示全部楼层
专业点应该可以叫混淆矩阵,举个例子:二分类问题,0占95,1占5,当样本不均衡的时候,我们使用二次代价函数进行优化,可能会造成模型在全预测为0的时候也能取得很好的效果,这个例子中就是95%的成功率。
所以出现了查准率,查全率,例如,在推荐系统中,你更加希望推荐的东西是不是准的,错了其实也没事,这时就可以用查准率
而在癌症预测过程中,你更希望将所有患者都查出来,因为如果有一个病人没查出来,可能就会造成它的治疗周期变短,失去最佳治疗时机,这时就用查全率

最后附下百度的公式:
1. 正确肯定(True Positive,TP):预测为真,实际为真
2. 正确否定(True Negative,TN):预测为假,实际为假
3. 错误肯定(False Positive,FP):预测为真,实际为假
4. 错误否定(False Negative,FN):预测为假,实际为真  
则:
查准率=TP/(TP+FP)
查全率=TP/(TP+FN)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-13 08:08:53 | 显示全部楼层
好像回复被吞了,再发一次吧
这个迷糊矩阵可以叫混淆矩阵,在二分类样本不平衡的时候,二次代价函数并不是很好用的时候,可以采用查重率,查准率来作为优化指标
附百度的公式:
1. 正确肯定(True Positive,TP):预测为真,实际为真
2. 正确否定(True Negative,TN):预测为假,实际为假
3. 错误肯定(False Positive,FP):预测为真,实际为假
4. 错误否定(False Negative,FN):预测为假,实际为真  
则:
查准率=TP/(TP+FP)例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
查全率=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
当你不知的查准率和查全率的那个更好的时候,可以使用F1分数,因为他是查准和查全的调和平均值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-13 08:09:34 | 显示全部楼层
本帖最后由 小锟 于 2018-6-13 18:32 编辑

重复了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 06:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表