濟寧萬達網(wǎng)站建設微信廣告推廣如何收費
數(shù)據(jù)分析:基于K-近鄰(KNN)對Pima人糖尿病預測分析
作者:AOAIYI
作者簡介:Python領域新星作者、多項比賽獲獎者:AOAIYI首頁
😊😊😊如果覺得文章不錯或能幫助到你學習,可以點贊👍收藏📁評論📒+關注哦!👍👍👍
📜📜📜如果有小伙伴需要數(shù)據(jù)集和學習交流,文章下方有交流學習區(qū)!一起學習進步!💪
專欄案例:數(shù)據(jù)分析 |
---|
數(shù)據(jù)分析:某電商優(yōu)惠卷數(shù)據(jù)分析 |
數(shù)據(jù)分析:旅游景點銷售門票和消費情況分析 |
數(shù)據(jù)分析:消費者數(shù)據(jù)分析 |
數(shù)據(jù)分析:餐廳訂單數(shù)據(jù)分析 |
數(shù)據(jù)分析:基于隨機森林(RFC)對酒店預訂分析預測 |
文章目錄
- 數(shù)據(jù)分析:基于K-近鄰(KNN)對Pima人糖尿病預測分析
- 一、前言
- 二、數(shù)據(jù)準備
- 三、數(shù)據(jù)預處理
- 四、建立模型
- 五、模型驗證
- 總結
一、前言
k-近鄰算法是分類數(shù)據(jù)最簡單最有效的算法,k-近鄰算法是基于實例的學習,使用算法時我們必須有接近實際數(shù)據(jù)的訓練樣本數(shù)據(jù)。k-近鄰算法必須保存全部數(shù)據(jù)集,如果訓練數(shù)據(jù)集的很大,必須使用大量的存儲空間。此外,由于必須對數(shù)據(jù)集中的每個數(shù)據(jù)計算距離值,實際使用時可能非常耗時。k-近鄰算法的另一個缺陷是它無法給出任何數(shù)據(jù)的基礎結構信息,因此我們也無法知曉平均實例樣本和典型實例樣本具有什么特征。
二、數(shù)據(jù)準備
1.數(shù)據(jù)準備
2.導入數(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ù)預處理
1.將每一列的標簽重新命名
data.columns = ["Pregnancies","Glucose","BloodPressure","SkinThickness","Insulin","BMI","DiabetesPedigreeFunction","Age","Outcome"]
data.head()
2.查看有沒有空值數(shù)據(jù)
data.isnull().any()
3.觀察樣本中陽性和陰性的個數(shù)
data.groupby("Outcome").size()
4.分離特征和標簽
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.劃分訓練集和測試集
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
分別訓練三個模型,計算平均評分
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]))
利用交叉驗證準確對比算法的精確性
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()))
通過以上結果顯示,普通KNN算法的性能更優(yōu)一些,接下來用普通KNN進行訓練
五、模型驗證
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))
以上結果顯示表明,訓練樣本的擬合情況不佳,模型的準確性欠佳
通過畫學習率曲線來觀察這一結論.
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()
學習曲線分析
從圖中可以看出來,訓練樣本的評分較低,且測試樣本與訓練樣本距離較大,這是典型的欠擬合現(xiàn)象,KNN算法沒有更好的措施解決欠擬合的問題,可以嘗試用其他的分類器。
總結
k-近鄰算法是分類數(shù)據(jù)最簡單最有效的算法,k-近鄰算法是基于實例的學習,使用算法時我們必須有接近實際數(shù)據(jù)的訓練樣本數(shù)據(jù)。k-近鄰算法必須保存全部數(shù)據(jù)集,如果訓練數(shù)據(jù)集的很大,必須使用大量的存儲空間。此外,由于必須對數(shù)據(jù)集中的每個數(shù)據(jù)計算距離值,實際使用時可能非常耗時。k-近鄰算法的另一個缺陷是它無法給出任何數(shù)據(jù)的基礎結構信息,因此我們也無法知曉平均實例樣本和典型實例樣本具有什么特征。