作者:Susan Li
編譯:袁雪瑤、吳雙、姜范波
根據美國疾病控制預防中心的數據,現在美國1/7的成年人患有糖尿病。但是到2050年,這個比例將會快速增長至高達1/3。我們在UCL機器學習數據庫里一個糖尿病數據集,希望可以通過這一數據集,了解如何利用機器學習來幫助我們預測糖尿病,讓我們開始吧!
https://github.com/susanli2016/Machine-Learning-with-Python/blob/master/diabetes.csv
數據:
糖尿病數據集可從UCI機器學習庫中獲取並下載。
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline diabetes=pd.read_csv('C:\Download\Machine-Learning-with-Python-master\Machine-Learning-with-Python-master\diabetes.csv') print(diabetes.columns)
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'], dtype='object')
特征(懷孕次數,血糖,血壓,皮脂厚度,胰島素,BMI身體質量指數,糖尿病遺傳函數,年齡,結果)
diabetes.head()
print(diabetes.groupby('Outcome').size())
Outcome 0 500 1 268 dtype: int64 “結果”是我們將要預測的特征,0意味着未患糖尿病,1意味着患有糖尿病。在768個數據點中,500個被標記為0,268個標記為1。
print("dimennsion of diabetes data:{}".format(diabetes.shape))
dimennsion of diabetes data:(768, 9),糖尿病數據集由768個數據點組成,各有9個特征。
import seaborn as sns sns.countplot(diabetes['Outcome'],label="Count")
KNN算法:
k-NN算法幾乎可以說是機器學習中最簡單的算法。建立模型只需存儲訓練數據集。而為了對新的數據點做出預測,該算法會在訓練數據集中找到與其相距最近的數據點——也就是它的“近鄰點”。首先,讓我們研究一下是否能夠確認模型的復雜度和精確度之間的關系:
from sklearn.model_selection import train_test_split x_train,x_test,y_train,y_test=train_test_split(diabetes.loc[:,diabetes.columns !='Outcome'],diabetes['Outcome'],stratify=diabetes['Outcome'],random_state=66) from sklearn.neighbors import KNeighborsClassifier training_accuracy=[] test_accuracy=[] #try n_neighbors from 1 to 10 neighbors_settings=range(1,11) for n_neighbors in neighbors_settings: #build the model knn=KNeighborsClassifier(n_neighbors=n_neighbors) knn.fit(x_train,y_train) #record training set accuracy training_accuracy.append(knn.score(x_train,y_train)) #record test set accuracy test_accuracy.append(knn.score(x_test,y_test)) plt.plot(neighbors_settings,training_accuracy,label="training accuracy") plt.plot(neighbors_settings,test_accuracy,label="test accuracy") plt.ylabel("Accuracy") plt.xlabel("n_neighbors") plt.legend() plt.savefig('knn_compare_model')
上圖展示了訓練集和測試集在模型預測准確度(y軸)和近鄰點個數設置(x軸)之間的關系。如果我們僅選擇一個近鄰點,那么訓練集的預測是絕對正確的。但是當更多的近鄰點被選入作為參考時,訓練集的准確度會下降,這表明了使用單一近鄰會導致模型太過復雜。這里的最好方案可以從圖中看出是選擇9個近鄰點。
圖中建議我們應該選擇n_neighbors=9,下面給出:
knn=KNeighborsClassifier(n_neighbors=9) knn.fit(x_train,y_train) print('Accuracy of K-NN classifier on training set:{:.2f}'.format(knn.score(x_train,y_train))) print('Accuracy of K-NN classifier on training set:{:.2f}'.format(knn.score(x_test,y_test)))
Accuracy of K-NN classifier on training set:0.79 Accuracy of K-NN classifier on training set:0.78