分类

分类

以手写数字图像识别为例

一、数据准备

1.下载MNIST数据集

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')

2.获取数据和标签

X, y = mnist['data'], mnist['target'] 

3.画出数字

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt

some_digit = X[0]
some_digit_image = some_digit.reshape(28, 28)
plt.imshow(some_digit_image, cmap=matplotlib.cm.binary)
plt.axis('off')
plt.show()

4.划分训练集和测试集的数据及标签

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

5.洗牌

import numpy as np
shuffle_index = np.random.permutation(60000)
X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]

二、训练模型

以5-非5二分类为例

1.重新生成标签

为了满足二分类的需求,重新生成以True和False代表5和非5的标签

y_train_5 = (y_train == '5')
y_test_5 = (y_test == '5')

2.训练模型

(1)随机梯度下降分类模型

from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42)
sgd_clf.fit(X_train, y_train_5)

(2)决策树分类模型

from sklearn.tree import DecisionTreeClassifier
tree_clf = DecisionTreeClassifier()
tree_clf.fit(X_train, y_train_5)

三、模型测评

1.交叉验证

使用交叉验证测试决策树模型性能

from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone
skfolds = StratifiedKFold(n_splits=3, random_state=42)

for train_index, test_index in skfolds.split(X_train, y_train_5):
    clone_clf = clone(tree_clf)
    # 找出分层随机选取的数据
    X_train_folds = X_train[train_index]
    y_train_folds = y_train_5[train_index]
    X_test_folds = X_train[test_index]
    y_test_folds = y_train_5[test_index]
    
    clone_clf.fit(X_train_folds, y_train_folds)
    y_pred = clone_clf.predict(X_test_folds)
    
    # 计算预测正确的数量
    n_correct = sum(y_pred == y_test_folds)
    
    # 打印正确率
    print(n_correct / len(y_pred))

注意:正确率不能作为模型好坏的衡量标准。

2.混淆矩阵

(1)一级指标

混淆矩阵

(2)二级指标

  • 真阳性率 TPR = TP / (TP + FN)(召回率)
  • 真阴性率 TNR = TN / (TN + FP)
  • 假阳性率 FPR = FP / (FP + TN)
  • 假阴性率 FNR = FN / (FN + TP)
精度与召回率
  • 准确率(Accuracy) = TP + TN / (TP + TN + FP + FN)
  • 精度(Precision) = TP / (TP + FP)
  • 召回率(Recall) = TP / (TP + FN)
二级指标 作用
准确率(A) 反映分类器对整个样本的判定能力,能将正的判定为正,负的判定为负的能力
精度(P) 真正类 占 所有被判定为正类的比例(正类的判断正确率),衡量查准率
召回率(R) 真正类被判定为真正类的比例(真正类的鉴别率),衡量查全率

(3)三级指标

F1分数

F1分数(精度召回率权重一致时)

F1分数(β=召回率权重比精度权重)
  • F1分数(F1-Score) = 2 / (1 / 精度 + 1 / 召回率) = 2 * (精度 * 召回率) / (精度 + 召回率)
# 混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix(标签向量, 预测向量)

# 精度、召回率、F1分数
from sklearn.metrics import precision_score, recall_score, f1_score
precision_score(标签向量, 预测向量)
recall_score(标签向量, 预测向量)
f1_score(标签向量, 预测向量)

3.精度召回率折衷

(1)决策分数

获取决策分数

y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method='decision_function')

(2)精度召回率曲线(Precision Recall Curves,PRC)

  • precision_recall_curve()函数会返回精度、召回率、阈值
from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)
  • 作图
%matplotlib inline
import matplotlib.pyplot as plt

def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
    plt.plot(thresholds, precisions[:-1], 'g--', label='Precision')
    plt.plot(thresholds, recalls[:-1], 'b--', label='Recall')
    plt.xlabel('Threshold')
    plt.ylim([0, 1])
    plt.legend(loc='upper left')
    
plot_precision_recall_vs_threshold(precisions, recalls, thresholds)
  • 查看精度和召回率的最佳值
def plot_precision_recall(precisions, recalls):
    plt.plot(recalls[:-1], precisions[:-1], 'b-')
    # plt.plot([0, 1], [0, 1], 'k--')
    plt.xlabel("recall")
    plt.ylabel("precision")
    plt.show()
    
plot_precision_recall(precisions, recalls)

(3)受试者操作特性曲线(Receiver Operating Characteristic,ROC)

ROC曲线:受试者工作特征曲线(接受者操作特性曲线)

纵轴:TPR=正类判定正确概率(真阳性率) = TP / (TP + FN)
横轴:FPR=负类判定错误概率(假阳性率) = FP / (FP + TN)

  • 绘制ROC曲线
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

def plot_roc_curve(fpr, tpr, label=None):
    plt.plot(fpr, tpr, linewidth=2, label=label)
    plt.plot([0, 1], [0, 1], 'k--')
    plt.axis([0, 1, 0, 1])
    plt.xlabel("FPR")
    plt.ylabel("TPR")
    plt.show()
    
plot_roc_curve(fpr, tpr)

虚线代表随机分类器的ROC曲线


四、多类别分类器

两种思路:

  • 1.一对多(OvA)(亦一对剩余,OvR):以数字识别为例,训练10个分类器(0-非0,1-非1,2-非2,......),每个分类器只能识别一种数字。识别时,输入一张图片,运行10个分类器,哪个分类器分数最高即分为哪类。
  • 2.一对一(OvO):以数字识别为例,训练多个分类器(为每一对数字训练一个分类器:0-1,0-2,0-3,......,9-7,9-8)。识别时,输入一张图片,运行45个分类器,哪个分类器获胜最多即分为哪类。

OvO优点:每个分类器不需要对全部数据进行训练,只需对用到的两个类别的数据进行运算。

  • 如果需要强制Scikit-Learn使用一对一或一对多策略,可以使用OneVsOneClassifier或OneVsRestClassifier类。
  • 只需创建一个实例,然后传给分类器的构造参数即可。
from sklearn.multiclass import OneVsOneClassifier
ovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42))
ovo_clf.fit(X_train, y_train)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容