python knn模型_使用Python训练KNN模型并进行分类
K臨近分類算法是數(shù)據(jù)挖掘中較為簡單的一種分類方法,通過計(jì)算不同數(shù)據(jù)點(diǎn)間的距離對(duì)數(shù)據(jù)進(jìn)行分類,并對(duì)新的數(shù)據(jù)進(jìn)行分類預(yù)測(cè)。我們?cè)谥暗奈恼隆禟鄰近(KNN)分類和預(yù)測(cè)算法的原理及實(shí)現(xiàn)》和《協(xié)同過濾推薦算法的原理及實(shí)現(xiàn)》兩篇文章中都詳細(xì)介紹過。本篇文章將介紹在python中使用機(jī)器學(xué)習(xí)庫sklearn建立K臨近模型(k-NearestNeighbor)的過程并使用模型對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè)。
準(zhǔn)備工作
首先是開始前的準(zhǔn)備工作,導(dǎo)入我們需要使用的庫文件。這里一共需要使用5個(gè)庫文件。第一個(gè)是機(jī)器學(xué)習(xí)庫,第二個(gè)是用于模型檢驗(yàn)的交叉檢驗(yàn)庫,第三個(gè)是數(shù)值計(jì)算庫,第四個(gè)是科學(xué)計(jì)算庫,最后是圖表庫。
#導(dǎo)入機(jī)器學(xué)習(xí)KNN分析庫
from sklearn.neighbors import KNeighborsClassifier
#導(dǎo)入交叉驗(yàn)證庫
from sklearn import cross_validation
#導(dǎo)入數(shù)值計(jì)算庫
import numpy as np
#導(dǎo)入科學(xué)計(jì)算庫
import pandas as pd
#導(dǎo)入圖表庫
import matplotlib.pyplot as plt
讀取并查看數(shù)據(jù)表
讀取并導(dǎo)入所需數(shù)據(jù),創(chuàng)建名為knn_data的數(shù)據(jù)表,后面我們將使用這個(gè)數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練和檢驗(yàn)。
#讀取并創(chuàng)建名為knn_data的數(shù)據(jù)表
knn_data=pd.DataFrame(pd.read_csv('knn_data.csv'))
使用head函數(shù)查看數(shù)據(jù)表的內(nèi)容,這里只查看前5行的數(shù)據(jù),數(shù)據(jù)表中包含三個(gè)字段,分別為貸款金額,用戶收入和貸款狀態(tài)。我們希望通過貸款金額和用戶收入對(duì)最終的貸款狀態(tài)進(jìn)行分類和預(yù)測(cè)。
#查看數(shù)據(jù)表前5行
knn_data.head(5)
繪制散點(diǎn)圖觀察分類
創(chuàng)建模型之前先對(duì)數(shù)據(jù)匯總散點(diǎn)圖,觀察貸款金額和用戶收入兩個(gè)變量的關(guān)系以及對(duì)貸款狀態(tài)的影響,下面是具體的代碼,根據(jù)貸款狀態(tài)將數(shù)據(jù)分為兩組,第一組為Fully Paid,第二組為Charged Off。
#Fully Paid數(shù)據(jù)集的x1
fully_paid_loan=knn_data.loc[(knn_data["loan_status"] == "Fully Paid"),["loan_amnt"]]
#Fully Paid數(shù)據(jù)集的y1
fully_paid_annual=knn_data.loc[(knn_data["loan_status"] == "Fully Paid"),["annual_inc"]]
#Charge Off數(shù)據(jù)集的x2
charged_off_loan=knn_data.loc[(knn_data["loan_status"] == "Charged Off"),["loan_amnt"]]
#Charge Off數(shù)據(jù)集的y2
charged_off_annual=knn_data.loc[(knn_data["loan_status"] == "Charged Off"),["annual_inc"]]
數(shù)據(jù)分組后開始繪制散點(diǎn)圖,下面是繪圖過程和具體的代碼。
#設(shè)置圖表字體為華文細(xì)黑,字號(hào)15
plt.rc('font', family='STXihei', size=15)
#繪制散點(diǎn)圖,Fully Paid數(shù)據(jù)集貸款金額x1,用戶年收入y1,設(shè)置顏色,標(biāo)記點(diǎn)樣式和透明度等參數(shù)
plt.scatter(fully_paid_loan,fully_paid_annual,color='#9b59b6',marker='^',s=60)
#繪制散點(diǎn)圖,Charge Off數(shù)據(jù)集貸款金額x2,用戶年收入y2,設(shè)置顏色,標(biāo)記點(diǎn)樣式和透明度等參數(shù)
plt.scatter(charged_off_loan,charged_off_annual,color='#3498db',marker='o',s=60)
#添加圖例,顯示位置右上角
plt.legend(['Fully Paid', 'Charged Off'], loc='upper right')
#添加x軸標(biāo)題
plt.xlabel('貸款金額')
#添加y軸標(biāo)題
plt.ylabel('用戶收入')
#添加圖表標(biāo)題
plt.title('貸款金額與用戶收入')
#設(shè)置背景網(wǎng)格線顏色,樣式,尺寸和透明度
plt.grid( linestyle='--', linewidth=0.2)
#顯示圖表
plt.show()
在散點(diǎn)圖中,紫色三角形為Fully Paid組,藍(lán)色圓形為Charged Off組。我們所要做的是通過KNN模型對(duì)這兩組數(shù)據(jù)的特征進(jìn)行學(xué)習(xí),例如從肉眼來看Fully Paid組用戶收入要高于Charged Off組。并使用模型對(duì)新的數(shù)據(jù)進(jìn)行分類預(yù)測(cè)。
設(shè)置模型的自變量和因變量
創(chuàng)建KNN模型前,先設(shè)置模型中的自變量和因變量,也就是特征和分類。這里將貸款金額和用戶收入設(shè)置為自變量,貸款狀態(tài)是我們希望預(yù)測(cè)的結(jié)果,因此設(shè)置為因變量。
#將貸款金額和用戶收入設(shè)為自變量X
X = np.array(knn_data[['loan_amnt','annual_inc']])
#將貸款狀態(tài)設(shè)為因變量Y
Y = np.array(knn_data['loan_status'])
設(shè)置完成后查看自變量和因變量的行數(shù),這類一共有29行數(shù)據(jù),后面我們將把這29行數(shù)據(jù)分割為訓(xùn)練集和測(cè)試集,訓(xùn)練集用來建立模型,測(cè)試集則對(duì)模型的準(zhǔn)確率進(jìn)行檢驗(yàn)。
#查看自變量和因變量的行數(shù)
X.shape,Y.shape
將數(shù)據(jù)分割為訓(xùn)練集和測(cè)試集
采用隨機(jī)抽樣的方式將數(shù)據(jù)表分割為訓(xùn)練集和測(cè)試集,其中60%的訓(xùn)練集數(shù)據(jù)用來訓(xùn)練模型,40%的測(cè)試集數(shù)據(jù)用來檢驗(yàn)?zāi)P蜏?zhǔn)確率。
#將原始數(shù)據(jù)通過隨機(jī)方式分割為訓(xùn)練集和測(cè)試集,其中測(cè)試集占比為40%
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, Y, test_size=0.4, random_state=0)
分割后測(cè)試集的數(shù)據(jù)為17條。這些數(shù)據(jù)用來訓(xùn)練模型。
#查看訓(xùn)練集數(shù)據(jù)的行數(shù)
X_train.shape,y_train.shape
對(duì)模型進(jìn)行訓(xùn)練
將訓(xùn)練集數(shù)據(jù)X_train和y_train代入到KNN模型中,對(duì)模型進(jìn)行訓(xùn)練。下面是具體的代碼和結(jié)果。
#將訓(xùn)練集代入到KNN模型中
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train,y_train)
使用測(cè)試集測(cè)對(duì)模型進(jìn)行測(cè)試
使用測(cè)試集數(shù)據(jù)X_test和y_test對(duì)訓(xùn)練后的模型進(jìn)行檢驗(yàn),模型準(zhǔn)確率為75%。
#使用測(cè)試集衡量模型準(zhǔn)確度
clf.score(X_test, y_test)
完成訓(xùn)練和測(cè)試后,使用模型對(duì)新數(shù)據(jù)進(jìn)行分類和預(yù)測(cè),下面我們建立一組新的數(shù)據(jù),貸款金額為5000元,用戶收入為40000,看看模型對(duì)新數(shù)據(jù)的分組結(jié)果。
#設(shè)置新數(shù)據(jù),貸款金額5000,用戶收入40000
new_data = np.array([[5000,40000]])
模型對(duì)新數(shù)據(jù)的分組結(jié)果為Charged Off。這個(gè)分類準(zhǔn)確嗎?我們繼續(xù)再來看下模型對(duì)這組新數(shù)據(jù)分組的概率。
#對(duì)新數(shù)據(jù)進(jìn)行分類預(yù)測(cè)
clf.predict(new_data)
67%的概率為Charged Off,33%的概率為Fully Paid。根據(jù)這一概率模型將新數(shù)據(jù)劃分到Charged Off組。
#新數(shù)據(jù)屬于每一個(gè)分類的概率
clf.classes_,clf.predict_proba(new_data)
—【所有文章及圖片版權(quán)歸 藍(lán)鯨(王彥平)所有。歡迎轉(zhuǎn)載,但請(qǐng)注明轉(zhuǎn)自“藍(lán)鯨網(wǎng)站分析博客”。】—
總結(jié)
以上是生活随笔為你收集整理的python knn模型_使用Python训练KNN模型并进行分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP BAPI 生产订单确认相关
- 下一篇: 如何用 Python 生成炫酷二维码及解