一、实例
1)构造极度偏差的数据
-
import numpy as np from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target.copy() # 构造极度偏斜的数据 # y = digits.target:y 和 digits.target 指向的是同一组数据,此处修改 y 时,digits.target 也会一起被修改,因为赋值符号 '=' 没有进行数据的 copy; # 如果想不改变 digits.target 的数据,需要更改赋值方式:y = digits.target.copy()digits.target.copy(); y[digits.target==9] = 1 y[digits.target!=9] = 0
- y = digits.target:y 和 digits.target 指向的是同一组数据,此处修改 y 时,digits.target 也会一起被修改,因为赋值符号 '=' 没有进行数据的 copy;
- y = digits.target.copy():改变 y 的数据时,不会改变 digits.target 的数据;
2)直接使用二分类算法分类预测
- LogisticRegression() 模块使用默认参数
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666) from sklearn.linear_model import LogisticRegression log_reg = LogisticRegression() log_reg.fit(X_train, y_train) log_reg.score(X_test, y_test) # 准确率:0.9755555555555555
- 由于数据是极度偏斜的,即使模型预测所有的样本的类型都是 0,准确度也能达到 0.9 左右;
- 准确度只能说明模型对每一个样本预测的准确程度,并不能真正能准确的找出类型为 1 的样本;
- 找出类型为 1 的样本才是业务的要求,精准全面的找出类型为 1 的样本才是算法模型要做的事,准确度并不能反映模型是否精准而全面的找出了类型为 1 的样本;(要根据业务最根本的目的设计算法,以及选择模型好坏的指标)
3)使用精准率和召回率做为判断模型好坏的指标
-
求混淆矩阵
y_log_predict = log_reg.predict(X_test) def TN(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 0) & (y_predict == 0)) def FP(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 0) & (y_predict == 1)) def FN(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 1) & (y_predict == 0)) def TP(y_true, y_predict): assert len(y_true) == len(y_predict) return np.sum((y_true == 1) & (y_predict == 1)) def confusion_matrix(y_true, y_predict): return np.array([ [TN(y_test, y_log_predict), FP(y_test, y_log_predict)], [FN(y_test, y_log_predict), TP(y_test, y_log_predict)] ]) confusion_matrix(y_test, y_log_predict) # 混淆矩阵:array([[403, 2], [9, 36]]
-
求精准率
def precision_score(y_true, y_predict): tp = TP(y_test, y_log_predict) fp = FP(y_test, y_log_predict) try: return tp / (tp + fp) except: return 0.0 precision_score(y_test, y_log_predict) # 精准率:0.9473684210526315
-
求召回率
def recall_score(y_true, y_predict): tp = TP(y_test, y_log_predict) fn = FN(y_test, y_log_predict) # try...except:异常检测; # 没有异常,执行 try 后面的语句; # 出现异常,执行 except 后面的语句, try: return tp / (tp + fn) except: return 0.0 recall_score(y_test, y_log_predict) # 召回率:0.8
4)scikit-learn 中的混淆矩阵、精准率、召回率
- 混淆矩阵、精准率、召回率,3 者的包都封装在了 sklearn.metrics 中,任何二分类算法都可以通过模块下对应的方法直接得到混淆矩阵、精准率、召回率;
-
混淆矩阵
from sklearn.metrics import confusion_matrix confusion_matrix(y_test, y_log_predict) # 混淆矩阵:array([[403, 2], [9, 36]], dtype=int64)
-
精准率
from sklearn.metrics import precision_score precision_score(y_test, y_log_predict) # 精准率:0.9473684210526315
-
召回率
from sklearn.metrics import recall_score recall_score(y_test, y_log_predict) # 召回率:0.8