濟(jì)寧萬達(dá)網(wǎng)站建設(shè)合肥網(wǎng)站推廣公司
數(shù)據(jù)分析:基于K-近鄰(KNN)對Pima人糖尿病預(yù)測分析
作者:AOAIYI
作者簡介:Python領(lǐng)域新星作者、多項(xiàng)比賽獲獎(jiǎng)?wù)?#xff1a;AOAIYI首頁
😊😊😊如果覺得文章不錯(cuò)或能幫助到你學(xué)習(xí),可以點(diǎn)贊👍收藏📁評論📒+關(guān)注哦!👍👍👍
📜📜📜如果有小伙伴需要數(shù)據(jù)集和學(xué)習(xí)交流,文章下方有交流學(xué)習(xí)區(qū)!一起學(xué)習(xí)進(jìn)步!💪
專欄案例:數(shù)據(jù)分析 |
---|
數(shù)據(jù)分析:某電商優(yōu)惠卷數(shù)據(jù)分析 |
數(shù)據(jù)分析:旅游景點(diǎn)銷售門票和消費(fèi)情況分析 |
數(shù)據(jù)分析:消費(fèi)者數(shù)據(jù)分析 |
數(shù)據(jù)分析:餐廳訂單數(shù)據(jù)分析 |
數(shù)據(jù)分析:基于隨機(jī)森林(RFC)對酒店預(yù)訂分析預(yù)測 |
文章目錄
- 數(shù)據(jù)分析:基于K-近鄰(KNN)對Pima人糖尿病預(yù)測分析
- 一、前言
- 二、數(shù)據(jù)準(zhǔn)備
- 三、數(shù)據(jù)預(yù)處理
- 四、建立模型
- 五、模型驗(yàn)證
- 總結(jié)
一、前言
k-近鄰算法是分類數(shù)據(jù)最簡單最有效的算法,k-近鄰算法是基于實(shí)例的學(xué)習(xí),使用算法時(shí)我們必須有接近實(shí)際數(shù)據(jù)的訓(xùn)練樣本數(shù)據(jù)。k-近鄰算法必須保存全部數(shù)據(jù)集,如果訓(xùn)練數(shù)據(jù)集的很大,必須使用大量的存儲(chǔ)空間。此外,由于必須對數(shù)據(jù)集中的每個(gè)數(shù)據(jù)計(jì)算距離值,實(shí)際使用時(shí)可能非常耗時(shí)。k-近鄰算法的另一個(gè)缺陷是它無法給出任何數(shù)據(jù)的基礎(chǔ)結(jié)構(gòu)信息,因此我們也無法知曉平均實(shí)例樣本和典型實(shí)例樣本具有什么特征。
二、數(shù)據(jù)準(zhǔn)備
1.數(shù)據(jù)準(zhǔn)備
2.導(dǎo)入數(shù)據(jù)
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
data = pd.read_csv("../input/Diabetes/pima-indians-diabetes.csv")
data.head()
data.shape
三、數(shù)據(jù)預(yù)處理
1.將每一列的標(biāo)簽重新命名
data.columns = ["Pregnancies","Glucose","BloodPressure","SkinThickness","Insulin","BMI","DiabetesPedigreeFunction","Age","Outcome"]
data.head()
2.查看有沒有空值數(shù)據(jù)
data.isnull().any()
3.觀察樣本中陽性和陰性的個(gè)數(shù)
data.groupby("Outcome").size()
4.分離特征和標(biāo)簽
X=data.iloc[:,0:8]
Y=data.iloc[:,8]
X=np.array(X)
Y=np.array(Y)
print("X:",X)
print('\n')
print("Y",Y)
5.劃分訓(xùn)練集和測試集
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier,RadiusNeighborsClassifier
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)
四、建立模型
models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=2)))
models.append(("KNN with weights",KNeighborsClassifier(n_neighbors=2,weights="distance")))
models.append(("Radius Neighbors",RadiusNeighborsClassifier(n_neighbors=2,radius=500.0)))
models
分別訓(xùn)練三個(gè)模型,計(jì)算平均評分
results = []
for name,model in models:model.fit(X_train,Y_train)results.append((name,model.score(X_test,Y_test)))
for i in range(len(results)):print("name:{},score:{}".format(results[i][0],results[i][1]))
利用交叉驗(yàn)證準(zhǔn)確對比算法的精確性
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
results = []
for name,model in models:Kfold = KFold(n_splits=10)cv_result = cross_val_score(model,X_train,Y_train,cv=Kfold)results.append((name,cv_result))for i in range(len(results)):print("name:{};cross_val_score:{}".format(results[i][0],results[i][1].mean()))
通過以上結(jié)果顯示,普通KNN算法的性能更優(yōu)一些,接下來用普通KNN進(jìn)行訓(xùn)練
五、模型驗(yàn)證
knn =KNeighborsClassifier(n_neighbors=2)
knn.fit(X_train,Y_train)
train_score = knn.score(X_train,Y_train)
test_score = knn.score(X_test,Y_test)
print("train_score:{};test score:{}".format(train_score,test_score))
以上結(jié)果顯示表明,訓(xùn)練樣本的擬合情況不佳,模型的準(zhǔn)確性欠佳
通過畫學(xué)習(xí)率曲線來觀察這一結(jié)論.
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import learning_curveimport matplotlib.pyplot as plt
%matplotlib inline
knn = KNeighborsClassifier(n_neighbors=2)
cv= ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)
plt.figure(figsize=(10,6),dpi=200)
plot_learning_curve(knn,"Learning Curve for KNN Diabetes",X,Y,ylim=(0.0,1.01),cv=cv)
plt.show()
學(xué)習(xí)曲線分析
從圖中可以看出來,訓(xùn)練樣本的評分較低,且測試樣本與訓(xùn)練樣本距離較大,這是典型的欠擬合現(xiàn)象,KNN算法沒有更好的措施解決欠擬合的問題,可以嘗試用其他的分類器。
總結(jié)
k-近鄰算法是分類數(shù)據(jù)最簡單最有效的算法,k-近鄰算法是基于實(shí)例的學(xué)習(xí),使用算法時(shí)我們必須有接近實(shí)際數(shù)據(jù)的訓(xùn)練樣本數(shù)據(jù)。k-近鄰算法必須保存全部數(shù)據(jù)集,如果訓(xùn)練數(shù)據(jù)集的很大,必須使用大量的存儲(chǔ)空間。此外,由于必須對數(shù)據(jù)集中的每個(gè)數(shù)據(jù)計(jì)算距離值,實(shí)際使用時(shí)可能非常耗時(shí)。k-近鄰算法的另一個(gè)缺陷是它無法給出任何數(shù)據(jù)的基礎(chǔ)結(jié)構(gòu)信息,因此我們也無法知曉平均實(shí)例樣本和典型實(shí)例樣本具有什么特征。