机器学习之数据分离与混淆矩阵

这篇具有很好参考价值的文章主要介绍了机器学习之数据分离与混淆矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容之数据分离与混淆矩阵。


数据分离

前面我们讲过的实例基本流程都是这样的:
数据载入→数据可视化与预处理→模型创建→全数据用于模型训练→模型评估

按照这个流程的前提是我们要有新数据来作为测试数据供我们使用,那么如果我们没有新数据用于模型评估表现怎么办呢?这时就需要用到数据分离了。

简单来说数据分离就是对全数据进行数据分离,部分数据用来训练,部分数据用于新数据的结果预测。一般就是二八分還是三七分吧

通常来说分为3步:
机器学习之数据分离与混淆矩阵
小例
机器学习之数据分离与混淆矩阵
机器学习之数据分离与混淆矩阵

这里就是将3个数据作为训练数据,两个数据作为测试数据。

混淆矩阵

在我们前面的分类任务中,都是计算测试数据集预测准确率(accuracy)以评估模型表现,但如果只用accuracy会有很大的局限性。
机器学习之数据分离与混淆矩阵
举个例子:
机器学习之数据分离与混淆矩阵

如果建立模型如模型1所示,预测准确率就为90%;但如果模型如模型2所示,预测所有的样本结果都是1,也就是说按这个模型无论测试数据是什么,结果都为1,这样就会导致无论数据怎样,我的准确率都是90%,这时得到的准确率就是空准确率。

机器学习之数据分离与混淆矩阵
这就是只用accuracy的局限性,即我们不知道各类型数据的预测情况,就拿上例来说,我们不知道0中预测准确率是多少,也不知道1中预测准确率是多少,我们只知道整体准确率是90%。同时,我们也无法看出模型错误预测的类型,我们并不知道是0预测不对还是1预测不对,这样会给我们优化模型带来很多不便。

所以,为了更好地评估模型,我们可以用混淆矩阵。

混淆矩阵:又称为误差矩阵,用于衡量分类算法的准确程度
具体的混淆矩阵如下图所示:
机器学习之数据分离与混淆矩阵
机器学习之数据分离与混淆矩阵

另外,通过混淆矩阵可以计算更丰富的模型评估指标:

机器学习之数据分离与混淆矩阵
举个例子:

机器学习之数据分离与混淆矩阵

机器学习之数据分离与混淆矩阵
这时我们可以发现负样本中预测正确的比例为0,我们就可以清楚地知道这个指标的预测是有问题的,进而可以修改优化我们的模型。

机器学习之数据分离与混淆矩阵

在这些指标中没有说谁更重要、谁不重要,其重要度取决于应用场景

以上課件來自慕課

實戰

好壞質檢分類實戰task:

  1. 基於data_class_raw.csv數據,根據高斯分佈概率密度函數,尋找異常點並剔除
  2. 基於data_class_processed.csv數據,進行PCA處理,確定重要數據維度及成分
  3. 完成數據分離,數據分離參數:random_state=4,test_size=0.4
  4. 建立KNN模型完成分類,n_beighbors取10,計算分類準確率,可視化分類邊界
  5. 計算測試數據集對應的混淆矩陣,計算準確率、召回率、特異度、精確率、F1分數
  6. 嘗試不同的n_neighbors(1-20),計算其在訓練數據集、測試數據集上的準確率並作圖
#load the data
import pandas as pd
import numpy as np
data = pd.read_csv('data_class_raw.csv')
data.head()

机器学习之数据分离与混淆矩阵

#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']

#visualize the data
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(5,5))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵

#anomy detection
from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope(contamination=0.02)
ad_model.fit(X[y==0])
y_predict_bad = ad_model.predict(X[y==0])
print(y_predict_bad)

-1為異常點

机器学习之数据分离与混淆矩阵

fig2 = plt.figure(figsize=(5,5))
bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.scatter(X.loc[:,'x1'][y==0][y_predict_bad==-1],X.loc[:,'x2'][y==0][y_predict_bad==-1],marker='x',s=150)
plt.legend((good,bad),('good','bad'))
plt.title('raw data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵

任務二

data = pd.read_csv('data_class_processed.csv')
data.head()
#define X and y
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
#pca
from sklearn.preprocessing import StandardScaler  #標準化處理
from sklearn.decomposition import PCA
X_norm = StandardScaler().fit_transform(X) #標準化處理
pca = PCA(n_components=2) #二維
X_reduced = pca.fit_transform(X_norm)
var_ratio = pca.explained_variance_ratio_ #標準差比例
print(var_ratio)
fig3 = plt.figure(figsize=(5,5))
plt.bar([1,2],var_ratio)
plt.show()

可以看出這兩個占比都很大也就沒必要降維了
机器学习之数据分离与混淆矩阵

# train and test split: random_state=4,test_size=0.4
from sklearn.model_selection import train_test_split #數據分離
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=4,test_size=0.4)
print(X_train.shape,X_test.shape,X.shape) #看一下訓練數據、測試數據占原始數據的多少

數據分離

机器学习之数据分离与混淆矩阵

#knn model
from sklearn.neighbors import KNeighborsClassifier
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_10.fit(X_train,y_train)
y_train_predict = knn_10.predict(X_train)
y_test_predict = knn_10.predict(X_test)

#calculate the accuracy
from sklearn.metrics import accuracy_score
accuracy_train = accuracy_score(y_train,y_train_predict)
accuracy_test = accuracy_score(y_test,y_test_predict)
print("training accuracy:",accuracy_train)
print("testing accuracy:",accuracy_test)

可以看出訓練數據準確率還可以,測試數據的不太行
机器学习之数据分离与混淆矩阵

#visualize the knn result and boundary
xx, yy = np.meshgrid(np.arange(0,10,0.05),np.arange(0,10,0.05)) #生成0-10間隔0.05的數據
print(xx)
print(xx.shape)

生成佈滿整個圖的點,主要是爲了畫出分類邊界
机器学习之数据分离与混淆矩阵

x_range = np.c_[xx.ravel(),yy.ravel()]
print(x_range.shape)
y_range_predict = knn_10.predict(x_range)

机器学习之数据分离与混淆矩阵

fig4 = plt.figure()
knn_bad = plt.scatter(x_range[:,0][y_range_predict==0],x_range[:,1][y_range_predict==0])
knn_good = plt.scatter(x_range[:,0][y_range_predict==1],x_range[:,1][y_range_predict==1])

bad = plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
good = plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.legend((good,bad,knn_good,knn_bad),('good','bad','knn_good','knn_bad'))
plt.title('predoction data')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

机器学习之数据分离与混淆矩阵

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_test_predict) #混淆矩陣
print(cm)

直接用sklearn裏面包生成混淆矩陣

机器学习之数据分离与混淆矩阵

机器学习之数据分离与混淆矩阵

TN = cm[0,0]
FP = cm[0,1]
FN = cm[1,0]
TP = cm[1,1]
print(TN,FP,FN,TP)

机器学习之数据分离与混淆矩阵

算一下各種指標

accuaracy = (TP + TN)/(TP + TN + FP + FN)
print(accuaracy)

可以看出這個跟上面算的是一樣的
机器学习之数据分离与混淆矩阵

recall = TP/(TP + FN)
print(recall)

机器学习之数据分离与混淆矩阵

specificity = TN/(TN + FP)
print(specificity)

机器学习之数据分离与混淆矩阵

precision = TP/(TP + FP)
print(precision)

机器学习之数据分离与混淆矩阵

f1 = 2 * precision * recall / (precision + recall)
print(f1)

机器学习之数据分离与混淆矩阵

#try different k and calcualte the accuracy for each
n = [i for i in range(1,21)]
accuaracy_train = []
accuaracy_test = []
for i in n:
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,y_train)
    y_train_predict = knn.predict(X_train)
    y_test_predict = knn.predict(X_test)
    accuaracy_train_i = accuracy_score(y_train,y_train_predict)
    accuaracy_test_i = accuracy_score(y_test,y_test_predict)
    accuaracy_train.append(accuaracy_train_i)
    accuaracy_test.append(accuaracy_test_i)
print(accuaracy_train,accuaracy_test)

嘗試不同的n_neighbors(1-20),計算其在訓練數據集、測試數據集上的準確率並作圖

机器学习之数据分离与混淆矩阵

fig5 = plt.figure(figsize=(15,5))
plt.subplot(121)
plt.plot(n,accuaracy_train,marker='o')
plt.title('training accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuaracy')
plt.subplot(122)
plt.plot(n,accuaracy_test,marker='o')
plt.title('testing accuracy vs n_neighbors')
plt.xlabel('n_neighbors')
plt.ylabel('accuaracy')

plt.show()

可視化看一下

机器学习之数据分离与混淆矩阵

可以看出n_neighbors值在20時效果最差,n_neighbors小時訓練數據效果好測試數據效果差,總體來説n_neighbors值和準確率並沒有很有規律,還是得多嘗試才知道n_neighbors取什麽好

總結

好壞質檢分類實戰summary:

  1. 通過進行異常監測,幫助找到了潛在的異常數據點
  2. 通過PCA分析,發現需要保留2維數據集
  3. 實現了訓練數據與測試數據的分離,並計算模型對於測試數據的預測準確率
  4. 計算得到混淆矩陣,實現模型更全面的評估
  5. 通過新的方法,可視化分類的決策邊界
  6. 通過調整核心參數n_neighbors值(K值),在計算對應的準確率,可以幫助我們更好的確定使用哪個模型
  7. 核心算法参考链接:
  • https://scikit-learn.org.cn/view/695.html
  • https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

這就是本次學習数据分离与混淆矩阵的筆記
附上本次實戰的數據集和源碼:
鏈接:https://github.com/fbozhang/python/tree/master/jupyter文章来源地址https://www.toymoban.com/news/detail-416056.html

到了这里,关于机器学习之数据分离与混淆矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习】分类器性能度量——混淆矩阵及sklearn实现

    记录一下混淆矩阵的学习心得,不写下来老是容易搞混.. 机器学习中,考量二分类问题的分类器性能时,可以将样本的实际类别与分类器预测类别,划分为如下 TN, FP, FN, TP 四种结果,组合起来就是大名鼎鼎的 confusion matrix 混淆矩阵。其中: True,False 表示预测结果与实际分类

    2024年02月10日
    浏览(54)
  • 【机器学习】二分类问题中的混淆矩阵、准确率、召回率等 (Python代码实现)

    混淆矩阵(Confusion Matrix):将分类问题按照真实情况与判别情况两个维度进行归类的一个矩阵,如在二分类问题中就是一个2*2的矩阵: TP(True Positive):表示实际为真预测为真 FP(False Positive):表示实际为假预测为真 (误报) TN(True Negative):表示实际为假预测为假 FN(False N

    2024年01月24日
    浏览(45)
  • 机器学习模型优劣评价指标:混淆矩阵,P-R曲线与平均精确度(附代码实现)

    文章参考:Mean Average Precision (mAP) Explained | Paperspace Blog 目录 一. Confusion Metrics混淆矩阵 二. Precision-Recall Curve, Average precision P-R曲线,平均精确度 三. 举例与代码实现 (1)从预测分数到类别标签(From Prediction Score to Class Label) (2)精确度-召回度曲线(Precision-Recall Curve) (3)平均

    2024年02月05日
    浏览(40)
  • 【超详细】机器学习sklearn之分类模型评估 混淆矩阵、ROC曲线、召回率与精度、F1分数

    机器学习之分类模型的评估 学习分类模型评估的方法: 1、混淆矩阵 2、分类结果汇总 3、ROC曲线 4、召回率与精度 5、F1分数 一、评估分类器性能的度量 1、真正(true positive, TP)或f++,对应的是被分类模型正确预测的正样本数。 2、假负(false negative, FN)或f±对应的是被分类模型错

    2023年04月08日
    浏览(89)
  • 【机器学习】全网最全模型评价指标(性能指标、YOLOv5训练结果分析、轻量化指标、混淆矩阵详解)【基础收藏】

    在目标检测任务中,我们常用的评价指标一般有两种,一种是使用Pascal VOC的评价指标,一种是更加严格的COCO评价指标,一般后者会更常用点。 如何判断一个检测结果是否正确。目前最常用的方式就是去计算检测框与真实框的IOU,然后 根据IOU去判别两个框是否匹配 。 常见指

    2024年02月04日
    浏览(47)
  • Python数据分析:混淆矩阵

    【小白从小学Python、C、Java】 【Python全国计算机等级考试】 【Python数据分析考试必会题】 ● 标题与摘要 Python数据分析 混淆矩阵 ● 选择题 以下关于混淆矩阵说法错误的是: A TP是被正确分类的正例个数 B FN是被错误分类的正例个数 C 主对角元素是不同类别样例被正确分类的

    2023年04月08日
    浏览(41)
  • MATLAB中矩阵/向量中数据的索引,例如A(1:2:end,:)

    一维向量 对于一维向量A,其第i个元素为A(i),由圆括号索引。i的范围为:1~length(A) 例如:A = [1,2,3,4,5,6,7,8] A(1) = 1 … A(8) = 8 在不知道向量长度的情况下,可以用end索引到最后一个元素。 A(end) = 8 对于 依次输出为 矩阵(多维向量) 对于矩阵A,其第i行第j列的元素为A(i,j),也是

    2024年02月12日
    浏览(32)
  • 大数据、人工智能、机器学习、深度学习关系联系前言

    1.大数据和人工智能关系 2.机器学习、深度学习、人工智能关系 3.监督学习、无监督学习、半监督学习、强化学习、迁移学习关系 4.机器学习具体内容 1.数据驱动的人工智能 :人工智能系统需要大量的数据来进行训练和学习。大数据提供了海量的信息,可以用于训练机器学习

    2024年02月12日
    浏览(56)
  • 机器学习基础(一)混淆矩阵,真阳性(TP),真阴性(TN),假阳性(FP),假阴性(FN)以及敏感性(Sensitivity)和特异性(Specificity)

    混淆矩阵如下图:这里以是否有心脏病举例(二分类举例),列代表机器学习算法所做的预测,有心脏病还是没有心脏病,行代表实际的情况。 真阳性(TP):病人有心脏病,且被算法正确的预测出有。 真阴性(TN):病人无心脏病,且被算法正确的预测出无。 假阴性(FN):病人有心

    2023年04月08日
    浏览(95)
  • 机器学习之数据清洗

    一、介绍 数据清洗是机器学习中的一个重要步骤,它涉及对原始数据进行预处理和修复,以使数据适用于机器学习算法的训练和分析。数据清洗的目标是处理数据中的噪声、缺失值、异常值和不一致性等问题,以提高数据的质量和准确性。   二、方法 处理缺失值:识别数据

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包