python混淆矩陣
❶ 如何用python畫好confusion matrix
在做分類的時候,經常需要畫混淆矩陣,下面我們使用python的matplotlib包,scikit-learning機器學習庫也同樣提供了例子:, 但是這樣的圖並不能滿足我們的要求,
首先是刻度的顯示是在方格的中間,這需要隱藏刻度,其次是如何把每個label顯示在每個方塊的中間, 其次是如何在每個方格中顯示accuracy數值, 最後是如何在橫坐標和縱坐標顯示label的名字,在label name比較長的時候,如何處理顯示問題。
直接貼上代碼:
[python]view plain
'''''computeconfusionmatrix
labels.txt:containlabelname.
predict.txt:predict_labeltrue_label
'''
fromsklearn.metricsimportconfusion_matrix
importmatplotlib.pyplotasplt
importnumpyasnp
#loadlabels.
labels=[]
file=open('labels.txt','r')
lines=file.readlines()
forlineinlines:
labels.append(line.strip())
file.close()
y_true=[]
y_pred=[]
#loadtrueandpredictlabels.
file=open('predict.txt','r')
lines=file.readlines()
forlineinlines:
y_true.append(int(line.split("")[1].strip()))
y_pred.append(int(line.split("")[0].strip()))
file.close()
tick_marks=np.array(range(len(labels)))+0.5
defplot_confusion_matrix(cm,title='ConfusionMatrix',cmap=plt.cm.binary):
plt.imshow(cm,interpolation='nearest',cmap=cmap)
plt.title(title)
plt.colorbar()
xlocations=np.array(range(len(labels)))
plt.xticks(xlocations,labels,rotation=90)
plt.yticks(xlocations,labels)
plt.ylabel('Truelabel')
plt.xlabel('Predictedlabel')
cm=confusion_matrix(y_true,y_pred)
printcm
np.set_printoptions(precision=2)
cm_normalized=cm.astype('float')/cm.sum(axis=1)[:,np.newaxis]
printcm_normalized
plt.figure(figsize=(12,8),dpi=120)
#setthefontsizeoflabel.
#forlabelinplt.gca().xaxis.get_ticklabels():
#label.set_fontsize(8)
#textportion
ind_array=np.arange(len(labels))
x,y=np.meshgrid(ind_array,ind_array)
forx_val,y_valinzip(x.flatten(),y.flatten()):
c=cm_normalized[y_val][x_val]
if(c>0.01):
plt.text(x_val,y_val,"%0.2f"%(c,),color='red',fontsize=7,va='center',ha='center')
#offsetthetick
plt.gca().set_xticks(tick_marks,minor=True)
plt.gca().set_yticks(tick_marks,minor=True)
plt.gca().xaxis.set_ticks_position('none')
plt.gca().yaxis.set_ticks_position('none')
plt.grid(True,which='minor',linestyle='-')
plt.gcf().subplots_adjust(bottom=0.15)
plot_confusion_matrix(cm_normalized,title='Normalizedconfusionmatrix')
#showconfusionmatrix
plt.show()
linchunmian
2017-05-08 2
結果如下圖所示:
閱讀全文
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目前您尚未登錄,請登錄或注冊後進行評論
❷ python3.5做分類時,混淆矩陣加在哪一步
preface:做著最近的任務,對數據處理,做些簡單的提特徵,用機器學習演算法跑下程序得出結果,看看哪些特徵的組合較好,這一系列流程必然要用到很多函數,故將自己常用函數記錄上。應該說這些函數基本上都會用到,像是數據預處理,處理完了後特徵提取、降維、訓練預測、通過混淆矩陣看分類效果,得出報告。
1.輸入
從數據集開始,提取特徵轉化為有標簽的數據集,轉為向量。拆分成訓練集和測試集,這里不多講,在上一篇博客中談到用StratifiedKFold()函數即可。在訓練集中有data和target開始。
2.處理
[python]view plain
defmy_preprocessing(train_data):
X_normalized=preprocessing.normalize(train_data,norm="l2",axis=0)#使用l2範式,對特徵列進行正則
returnX_normalized
defmy_feature_selection(data,target):
fromsklearn.feature_selectionimportSelectKBest
fromsklearn.feature_selectionimportchi2
data_new=SelectKBest(chi2,k=50).fit_transform(data,target)
returndata_new
defmy_PCA(data):#datawithouttarget,justtraindata,withoutraintarget.
pca_sklearn=decomposition.PCA()
pca_sklearn.fit(data)
main_var=pca_sklearn.explained_variance_
printsum(main_var)*0.9
importmatplotlib.pyplotasplt
n=15
plt.plot(main_var[:n])
plt.show()
defclf_train(data,target):
fromsklearnimportsvm
#fromsklearn.linear_modelimportLogisticRegression
clf=svm.SVC(C=100,kernel="rbf",gamma=0.001)
clf.fit(data,target)
#clf_LR=LogisticRegression()
#clf_LR.fit(x_train,y_train)
#y_pred_LR=clf_LR.predict(x_test)
returnclf
defmy_confusion_matrix(y_true,y_pred):
fromsklearn.metricsimportconfusion_matrix
labels=list(set(y_true))
conf_mat=confusion_matrix(y_true,y_pred,labels=labels)
print"confusion_matrix(leftlabels:y_true,uplabels:y_pred):"
print"labels ",
foriinrange(len(labels)):
printlabels[i]," ",
print
foriinrange(len(conf_mat)):
printi," ",
forjinrange(len(conf_mat[i])):
printconf_mat[i][j],' ',
print
print
defmy_classification_report(y_true,y_pred):
fromsklearn.metricsimportclassification_report
print"classification_report(left:labels):"
printclassification_report(y_true,y_pred)
- my_preprocess()函數:
- 主要參考sklearn官網
主要使用sklearn的preprocessing函數中的normalize()函數,默認參數為l2範式,對特徵列進行正則處理。即每一個樣例,處理標簽,每行的平方和為1.
my_feature_selection()函數:
使用sklearn的feature_selection函數中SelectKBest()函數和chi2()函數,若是用詞袋提取了很多維的稀疏特徵,有必要使用卡方選取前k個有效的特徵。
my_PCA()函數:
主要用來觀察前多少個特徵是主要特徵,並且畫圖。看看前多少個特徵佔據主要部分。
clf_train()函數:
可用多種機器學習演算法,如SVM, LR, RF, GBDT等等很多,其中像SVM需要調參數的,有專門調試參數的函數如StratifiedKFold()(見前幾篇博客)。以達到最優。
my_confusion_matrix()函數:
主要是針對預測出來的結果,和原來的結果對比,算出混淆矩陣,不必自己計算。其對每個類別的混淆矩陣都計算出來了,並且labels參數默認是排序了的。
my_classification_report()函數:
主要通過sklearn.metrics函數中的classification_report()函數,針對每個類別給出詳細的准確率、召回率和F-值這三個參數和宏平均值,用來評價演算法好壞。另外ROC曲線的話,需要是對二分類才可以。多類別似乎不行。
❸ python svm 怎麼訓練模型
支持向量機SVM(Support Vector Machine)是有監督的分類預測模型,本篇文章使用機器學習庫scikit-learn中的手寫數字數據集介紹使用Python對SVM模型進行訓練並對手寫數字進行識別的過程。
准備工作
手寫數字識別的原理是將數字的圖片分割為8X8的灰度值矩陣,將這64個灰度值作為每個數字的訓練集對模型進行訓練。手寫數字所對應的真實數字作為分類結果。在機器學習sklearn庫中已經包含了不同數字的8X8灰度值矩陣,因此我們首先導入sklearn庫自帶的datasets數據集。然後是交叉驗證庫,SVM分類演算法庫,繪制圖表庫等。
12345678910#導入自帶數據集from sklearn import datasets#導入交叉驗證庫from sklearn import cross_validation#導入SVM分類演算法庫from sklearn import svm#導入圖表庫import matplotlib.pyplot as plt#生成預測結果准確率的混淆矩陣from sklearn import metrics讀取並查看數字矩陣
從sklearn庫自帶的datasets數據集中讀取數字的8X8矩陣信息並賦值給digits。
12#讀取自帶數據集並賦值給digitsdigits = datasets.load_digits()查看其中的數字9可以發現,手寫的數字9以64個灰度值保存。從下面的8×8矩陣中很難看出這是數字9。
12#查看數據集中數字9的矩陣digits.data[9]以灰度值的方式輸出手寫數字9的圖像,可以看出個大概輪廓。這就是經過切割並以灰度保存的手寫數字9。它所對應的64個灰度值就是模型的訓練集,而真實的數字9是目標分類。我們的模型所要做的就是在已知64個灰度值與每個數字對應關系的情況下,通過對模型進行訓練來對新的手寫數字對應的真實數字進行分類。
1234#繪制圖表查看數據集中數字9的圖像plt.imshow(digits.images[9], cmap=plt.cm.gray_r, interpolation='nearest')plt.title('digits.target[9]')plt.show()
從混淆矩陣中可以看到,大部分的數字SVM的分類和預測都是正確的,但也有個別的數字分類錯誤,例如真實的數字2,SVM模型有一次錯誤的分類為1,還有一次錯誤分類為7。
❹ python 怎麼畫與其他方法進行比較的ROC曲線
使用sklearn的一系列方法後可以很方便的繪制處ROC曲線,這里簡單實現以下。
主要是利用混淆矩陣中的知識作為繪制的數據(如果不是很懂可以先看看這里的基礎):
tpr(Ture Positive Rate):真陽率 圖像的縱坐標
fpr(False Positive Rate):陽率(偽陽率) 圖像的橫坐標
mean_tpr:累計真陽率求平均值
mean_fpr:累計陽率求平均值
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import StratifiedKFold
iris = datasets.load_iris()
X = iris.data
y = iris.target
X, y = X[y != 2], y[y != 2] # 去掉了label為2,label只能二分,才可以。
n_samples, n_features = X.shape
# 增加雜訊特徵
random_state = np.random.RandomState(0)
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
cv = StratifiedKFold(n_splits=6) #導入該模型,後面將數據劃分6份
classifier = svm.SVC(kernel='linear', probability=True,random_state=random_state) # SVC模型 可以換作AdaBoost模型試試
# 畫平均ROC曲線的兩個參數
mean_tpr = 0.0 # 用來記錄畫平均ROC曲線的信息
mean_fpr = np.linspace(0, 1, 100)
cnt = 0
for i, (train, test) in enumerate(cv.split(X,y)): #利用模型劃分數據集和目標變數 為一一對應的下標
cnt +=1
probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test]) # 訓練模型後預測每條樣本得到兩種結果的概率
fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1]) # 該函數得到偽正例、真正例、閾值,這里只使用前兩個
mean_tpr += np.interp(mean_fpr, fpr, tpr) # 插值函數 interp(x坐標,每次x增加距離,y坐標) 累計每次循環的總值後面求平均值
mean_tpr[0] = 0.0 # 將第一個真正例=0 以0為起點
roc_auc = auc(fpr, tpr) # 求auc面積
plt.plot(fpr, tpr, lw=1, label='ROC fold {0:.2f} (area = {1:.2f})'.format(i, roc_auc)) # 畫出當前分割數據的ROC曲線
plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') # 畫對角線
mean_tpr /= cnt # 求數組的平均值
mean_tpr[-1] = 1.0 # 坐標最後一個點為(1,1) 以1為終點
mean_auc = auc(mean_fpr, mean_tpr)
plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = {0:.2f})'.format(mean_auc), lw=2)
plt.xlim([-0.05, 1.05]) # 設置x、y軸的上下限,設置寬一點,以免和邊緣重合,可以更好的觀察圖像的整體
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') # 可以使用中文,但需要導入一些庫即字體
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
❺ python隨機森林分類模型,測試集和訓練集的樣本數沒有準確按照70%和30%分配
進行比例劃分的時候 從 int 型 轉化為了 float 型, float型總是會有微小的誤差的,這個不是大問題。
比如你輸入 1- 0.9 , 可能返回 0.1, 也可能返回0.09999999 或者 0.100000000001 , 這是計算機存儲機制導致的。
❻ 混淆矩陣熱力圖什麼意思
混淆矩陣熱力圖意思是機器學習中總結分類模型預測結果的情形分析表,以矩陣形式將數據集中的記錄按照真實的類別與分類模型作出的分類判斷兩蠢遲個標准賀掘進行匯總。 示例:
2. python 函數 官方文檔中給出的用法帶拍李是 sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None) y_true
❼ python裡面一些簡單代碼的含義是什麼(題主零基礎)
主要就兩個文件 一個是sample的名字 labels.txt
還有個放矩陣 predict.txt 兩列,一列pre 二列true
放矩陣那裡他高春會調confusion_matrix自己算,如大緩果你自己算好了不需要算,那代碼就要改
confusion_matrix介紹見
http://scikit-learn.org/stable/moles/generated/sklearn.metrics.confusion_matrix.html
這東西用R畫快多了,python的也只是滾念模剛才看了下介紹,應該沒啥大問題
❽ Python hmmlearn中的混淆矩陣是怎麼表示的
hmmlearn這個庫有三種模型,分別是Gaussian,Multinomial和GMMHMM。這三種模型對應的就是三種emission
matrix(即混淆矩陣,也就是隱狀態到觀察態的概率)。Gaussian就是說混淆矩陣是一個高斯分布,即觀察態是連續的。Multinomiual就是說混淆矩陣事一個Multibimiual
distribution,即觀察態勢離散的。GMMHMM則是說混淆矩陣是遵循gaussinan
mixture
分布,也是連續的。
題主問如何把混淆矩陣輸入到模型裡面。首先你要確定你的混淆矩陣的類型。對於Gaussian類型,就是把你希望的
mean和variance值放到模型裡面。我就直接把文檔裡面的例子搬過來,例子里是建立了一個高斯分布的隱馬爾科夫模型。
>>>
import
numpy
as
np
>>>
from
hmmlearn
import
hmm
#一個隱馬爾科夫模型由(p向量,狀態轉移矩陣,混淆矩陣)來定義。
>>>
startprob
=
np.array([0.6,
0.3,
0.1])
#
定義初始狀態的概率
>>>
transmat
=
np.array([[0.7,
0.2,
0.1],
[0.3,
0.5,
0.2],
[0.3,
0.3,
0.4]])#定義轉移矩陣的概率
>>>
means
=
np.array([[0.0,
0.0],
[3.0,
-3.0],
[5.0,
10.0]])
#定義混淆矩陣的均值
>>>
covars
=
np.tile(np.identity(2),
(3,
1,
1))#
定義混淆矩陣的方差
>>>
model
=
hmm.GaussianHMM(3,
"full",
startprob,
transmat)#
定義一個混淆矩陣為高斯分布的隱馬爾科夫模型。
這里『full』的意思就是說你輸入的方差矩陣每個元素都給出了,不是一個只是對角線上的元素為0的矩陣
>>>
model.means_
=
means
>>>
model.covars_
=
covars#把你希望的均值方差輸入你定義的模型裡面,到此你就把混淆矩陣輸入進模型了
>>>
X,
Z
=
model.sample(100)
對於Multinomial
和
GMM,我還沒用,不過Multinomial應該是需要你自己手動輸入隱狀態到觀察態的概率的,而GMM應該是和Gaussian類型類似,只是需要多輸入一個權重因子。
對於第二個問題,covariance_type意思是你的混淆矩陣的covariance
matrix是什麼類型,比如若只是對角線上的元素不為0,則把covariance_type設為『diag』。
❾ Python hmmlearn中的混淆矩陣是怎麼表示的
hmmlearn這個庫有三種模型,分別是Gaussian,Multinomial和GMMHMM。這三種模型對應的就是三種emission matrix(即混淆矩陣,也就是隱狀態到觀察態的概率)。Gaussian就是說混淆矩陣是一個高斯分布,即觀察態是連續的。Multinomiual就是說混淆矩陣事一個Multibimiual distribution,即觀察態勢離散的。GMMHMM則是說混淆矩陣是遵循gaussinan mixture 分布,也是連續的。
題主問如何把混淆矩陣輸入到模型裡面。首先你要確定你的混淆矩陣的類型。對於Gaussian類型,就是把你希望的 mean和variance值放到模型裡面。我就直接把文檔裡面的例子梁旁搬過來,例子里是建立了一個高斯分布的隱馬爾科夫模型。
>>> import numpy as np
>>> from hmmlearn import hmm
#一個隱馬爾科夫模型由(p向量,狀態轉移矩陣,混淆矩陣)來定義。
>段友>> startprob = np.array([0.6, 0.3, 0.1])
# 定義初始狀態的概率
>>> transmat = np.array([[0.7, 0.2, 0.1], [0.3, 0.5, 0.2], [0.3, 0.3, 0.4]])#定義轉移矩陣的概率
>>> means = np.array([[0.0, 0.0], [3.0, -3.0], [5.0, 10.0]])
#定義混淆矩陣的均值
>>> covars = np.tile(np.identity(2), (3, 1, 1))# 定義混淆矩陣的方差
>>> model = hmm.GaussianHMM(3, "full", startprob, transmat)# 定義一個混淆矩陣為高斯分布的隱馬爾科夫模型。 這里『full』的意思就是說你輸入的方差矩陣每個元素都給出了,不是一個只是對角線上的元素為0的矩陣
>>> model.means_ = means
>>> model.covars_ = covars#把你希望的均值方差輸入你定義的模型裡面,到此你就把混淆矩握渣槐陣輸入進模型了
>>> X, Z = model.sample(100)
對於Multinomial 和 GMM,我還沒用,不過Multinomial應該是需要你自己手動輸入隱狀態到觀察態的概率的,而GMM應該是和Gaussian類型類似,只是需要多輸入一個權重因子。
對於第二個問題,covariance_type意思是你的混淆矩陣的covariance matrix是什麼類型,比如若只是對角線上的元素不為0,則把covariance_type設為『diag』。
❿ python是否有繪制混淆矩陣的函數,怎麼來實現
#-*-coding:UTF-8-*-
"""繪制混淆矩陣圖"""
importmatplotlib.pyplotasplt
fromsklearn.metricsimportconfusion_matrix
defconfusion_matrix_plot_matplotlib(y_truth,y_predict,cmap=plt.cm.Blues):
"""Matplotlib繪制混淆矩陣圖
parameters
----------
y_truth:真實的y的值,1darray
y_predict:預測的y的值,1darray
cmap:畫混淆矩陣圖的配色風格,使用cm.Blues,更多風格請參考官網
"""
cm=confusion_matrix(y_truth,y_predict)
plt.matshow(cm,cmap=cmap)#混淆矩陣圖
plt.colorbar()#顏色標簽
forxinrange(len(cm)):#數據標簽
foryinrange(len(cm)):
plt.annotate(cm[x,y],xy=(x,y),horizontalalignment='center',verticalalignment='center')
plt.ylabel('Truelabel')#坐標軸標簽
plt.xlabel('Predictedlabel')#坐標軸標簽
plt.show()#顯示作圖結果
if__name__=='__main__':
y_truth=[1,0,1,1,1,1,1,1,1,1,0,0,0,0,0]
y_predict=[1,0,0,1,0,1,1,1,1,1,0,1,0,1,0]
confusion_matrix_plot_matplotlib(y_truth,y_predict)