本節書摘來自異步社群出版社《寫給程式員的資料挖掘實踐指南》一書中的第5章,第5.7節,作者:【美】ron zacharski(紮哈爾斯基),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
現在到考察一個新資料集的時候了,該資料集是美國國立糖尿病、消化和腎髒疾病研究所(united states national institute of diabetes and digestive and kidney diseases,簡稱niddk)所開發的皮馬印第安人糖尿病資料集(pima indians diabetes data set)。

令人吃驚的是,有超過30%的皮馬人患有糖尿病。與此形成對照的是,美國糖尿病的患病率為8.3%,中國為4.2%。
資料集中的每個執行個體表示一個超過21歲的皮馬女性的資訊,她屬于以下兩類之一,即5年内是否患過糖尿病。每個人有8個屬性。
屬性:
1.懷孕次數。
2.2小時口服葡萄糖耐量測試中得到的血糖濃度。
3.舒張期血壓(mm hg)。
4.三頭肌皮脂厚度(mm)。
5.2小時血清胰島素(mu u/ml)。
6.身體品質指數(體重kg/(身高in m)^2)。
7.糖尿病家系作用。
8.年齡。
下面給出了一個資料的例子(最後一清單示類别:0表示沒有糖尿病,1表示有糖尿病)。
2 99 52 15 94 24.6 0.637 21 0
3 83 58 31 18 34.3 0.336 25 0
5 139 80 35 160 31.6 0.361 25 1
3 170 64 37 225 34.5 0.356 30 1
是以,上例中第一位女性有過兩個孩子,血糖為99,舒張期血壓為52,等等。
在本書網站上有個兩個檔案,其中zip檔案pimasmall.zip中包含100個執行個體,它們分到10個檔案(桶)中。而pima.zip檔案則包含393個執行個體。當使用上一章建構的近鄰分類器對pimasmall資料集進行10折交叉驗證時,會得到如下結果:
提示:
python函數heapq.nsmallest(n,list)會傳回最小的n個元素構成的清單(list)。
下面是你要完成的任務:
從本書網站下載下傳分類器的代碼,實作knn算法。此時需要修改類中的initializer方法以便加入另一個參數k:
該方法的簽名看起來類似于def knn(self, itemvector):
它應該使用self.k(記住要在init方法中設定該值)并傳回類别結果(在pima癌症資料集上為0或1),還應該修改tenfold過程以便将k傳遞給initializer。
我對init_的修改十分簡單:
我的knn方法如下:
我對tenfold的一點點修改如下: