機械分類--- LR分類+モデル評価


より詳細なデータセットの紹介(グラフィック分析、理解しやすいはずです)
https://blog.csdn.net/weixin_42567027/article/details/107416002

データセット

データセットには3つのカテゴリがあり、各カテゴリには50のサンプルがあります。

ROC曲線とAUC

理論的知識

ROC曲線は、二項分類問題の評価指標です。これは、異なるしきい値の下でTPRとFPRの関係をプロットし、本質的に「信号」を「ノイズ」から分離する確率曲線です。
ROC曲線のx軸はFPRであり、y軸はTPRです。
ここに画像の説明を挿入
ここに画像の説明を挿入

曲線の理解

ここに画像の説明を挿入
直線のランダム確率はランダム確率であり、確率の半分は正しく、確率の半分は間違っています。この線よりも低い場合は、アルゴリズムが非常に悪く、ランダムな推測ほど良くないことを意味します。
したがって、この行の左側は、アルゴリズムが優れていることを示しています。
次に、計算されたFPR値とTPR値に従って実際の曲線が取得されます。

計算例

ここに画像の説明を挿入
特定の計算プロセス

ここに画像の説明を挿入
ここに画像の説明を挿入
AUC
AUCは、分類器が分類する能力、つまりROCの領域の尺度であり、結果は数値です。
AUC値が大きいほど、現在の分類アルゴリズムが負のサンプルの前に正のサンプルをランク付けする可能性が高くなります。つまり、より適切に分類できます。

コード

// An highlighted block
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures

if __name__ == '__main__':
    pd.set_option('display.width', 300)
    pd.set_option('display.max_columns', 300)

    '''加载数据'''
    data = pd.read_csv('F:\pythonlianxi\iris.csv', header=None)
    #设置列标签
    columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'type']
    #rename:用于命名文件或目录
    data.rename(columns=dict(zip(np.arange(5), columns)), inplace=True)
    #Categorical:将类别信息转化成数值信息,因此将type中的数据类型进行转化
    data['type'] = pd.Categorical(data['type']).codes
    #print (data)
    '''数据集和标签集'''
    #x存储的是除type类外的数据,也就是数据集
    x = data.loc[:, columns[:-1]]
    #y中存储的是type数据,也就是标签集
    y = data['type']

    '''LR分类'''
    #训练集和测试集样本
    x, x_test, y, y_test = train_test_split(x, y, train_size=0.7)
    clf = Pipeline([
        #做线性回归预测时候,为了提高模型的泛化能力,经常采用多次线性函数建立模型
        #PolynomialFeatures:特征选择  degree:选择线性函数次数
        ('poly', PolynomialFeatures(degree=2, include_bias=True)),
        ('lr', LogisticRegressionCV(Cs=np.logspace(-3, 4, 8), cv=5, fit_intercept=False))])
    #调参
    clf.fit(x, y)
    y_hat = clf.predict(x)
    print ('训练集精确度:', metrics.accuracy_score(y, y_hat))
    y_test_hat = clf.predict(x_test)
    print ('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))

    '''AUC-ROC曲线'''
    n_class = len(data['type'].unique())
    #y_test:测试集的标签   label_binarize:标签二值化
    y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))
    #predict_proba返回的是一个n行k列的数组,
    # 第i行第j列上的数值是模型预测第i个预测样本为某个标签的概率,并且每一行的概率和为1。
    #测试集分类正确的概率
    y_test_one_hot_hat = clf.predict_proba(x_test)
   
    ##metrics.roc_curve:计算ROC曲线面积,选取一个阈值计算TPR/FPR
    fpr, tpr, thresholds= metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
    print ('Micro AUC:\t', metrics.auc(fpr, tpr))
    print ('Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))
    #阈值的选取规则是在scores值中从大到小的以此选取
    auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
    print( 'Macro AUC:\t', auc)

    '''绘图'''
    mpl.rcParams['font.sans-serif'] = u'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    plt.figure(figsize=(8, 7), dpi=80, facecolor='w')
    plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)
    plt.legend(loc='lower right',fontsize=20)
    #对x轴,y轴的坐标值进行限制
    plt.xlim((-0.01, 1.02))
    plt.ylim((-0.01, 1.02))
    plt.xticks(np.arange(0, 1.1, 0.1))
    plt.yticks(np.arange(0, 1.1, 0.1))
    plt.xlabel('False Positive Rate', fontsize=20)
    plt.ylabel('True Positive Rate', fontsize=20)
    plt.grid(b=True, ls=':')
    plt.title(u'ROC曲线和AUC', fontsize=24)
    plt.show()

ここに画像の説明を挿入

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_42567027/article/details/107423666