鄔書豪,數據挖掘工程師 ,人工智慧愛好者社區負責人。微信ID:tsaiedu 知乎專欄:https://www.zhihu.com/people/wu-shu-hao-67/activities
往期回顧
本文的主要內容就是針對經典的Breast Cancer Wisconsin (Diagnostic)數據,分別通過R和Python兩種語言去實現KNN分類算法。
本文的R代碼源於Brett Lantz的《Machine Learning with R》書籍第三章。當然這本書大家也不少人看過,並且也看過很多的有關這個案例的分析,今天我就給大家用兩種語言去對比實現此案例的實戰。
文章共分為四部分:
(1)加載程序包
(1)讀取數據
(2)探索和準備數據
(3)訓練模型
(4)模型評估
## 加載程序包
library(caret)
library(class) # knn
#### Py code
import pandas as pd #read_csv
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix
在R中一共加載了兩個程序包,代碼後面注釋代表後續用到的此包中的函數。Py中就不用解釋了,代碼就已經很清楚了。
## 讀取數據
wisconsin <- read.csv("../input/wisconsin.csv")
#### Py code
wisconsin = pd.read_csv("../input/wisconsin.csv")
## 整體探索數據信息
#### R code
str(wisconsin)
head(wisconsin)
summary(wisconsin)
以上分別是R對數據集簡單結構的探索、查看數據的前3行和統計數據的主要描述性統計量。這三個操作能展現出的信息我就不在重複了,大家都這個數據集肯定也是爛熟於心了。下面使用Python語言去實現R展示出的信息:
#### Py code
wisconsin.dtypes
wisconsin.shape
wisconsin.head(3)
wisconsin.describe()
利用這四行代碼,我們展示出了與R所展示出的一樣的信息。
## 探索數據的目標變量
wisconsin <- wisconsin[-1]
table(wisconsin$diagnosis)
prop.table(table(wisconsin$diagnosis))
上圖三行代碼的意義分別是:剔除數據集的第一列("id"),此列對於建模沒有任何意義;查看目標變量("diagnosis")的特徵值的個數;查看目標變量("diagnosis")的特徵值的佔比。
wisconsin = wisconsin.drop("id", axis=1)
wisconsin["diagnosis"].value_counts()
wisconsin["diagnosis"].value_counts(normalize=True)
## 對自變量進行歸一化
normalize <- function(x) {
return( (x-min(x)) / (max(x)-min(x)))
}
wisconsin[2:31] <- as.data.frame(lapply(wisconsin[2:31], normalize))
通過自定義歸一化的函數,加上使用lapply函數,我們就高效地對數據的每一列進行了歸一化,從而使我們的數值都壓縮到了0-1範圍內。下面注釋的代碼是用caret包裡面的函數進行標準化的,兩種方法得到的數據一樣,但是強烈推薦後者,因為其可以自動避免非數值型數據,從而對數值型數據進行歸一化。下面我們使用py來對比一下:
#### Py code
wisconsin_x = wisconsin.drop(['diagnosis'], axis=1)
wisconsin_y = wisconsin['diagnosis']
wisconsin_sta = (wisconsin_x - wisconsin_x.min()) / (wisconsin_x.max() - wisconsin_x.min())
wisconsin_sta.head(3)
通過以上的py代碼,我們同樣對數據進行了歸一化,後面注釋的代碼同樣也可以達到歸一化的目的。
## 建立訓練集和測試集
#### R code
traindata <- wisconsin[1:469, -1]
testdata <- wisconsin[470:569, -1]
train_label <- wisconsin[1:469, 1]
test_label <- wisconsin[470:569, 1]
#### Py code
traindata = wisconsin_x.loc[0:468]
testdata = wisconsin_x.loc[469:568]
train_label = wisconsin_y.loc[0:468]
test_label = wisconsin_y.loc[469:568]
上面分別使用R和Py創建了訓練集、測試集和訓練集標籤、測試集標籤。下面開始使用knn進行分類:
## 訓練模型#### R code
pred <- knn(traindata, testdata, cl = train_label, k = 21)
#### Py code
clf = KNeighborsClassifier(n_neighbors=21)
clf = clf.fit(X=traindata, y=train_label)
pred = clf.predict(testdata)
上面分別使用R和Py使用訓練集建立了knn模型,下面使用混淆矩陣做模型評估:
## 模型評估
table(pred, test_label)
confusion_matrix(test_label, pred)
以上是混淆矩陣,大家也看到了混淆矩陣中的「2」處的位置不同,可能會有疑問。這是因為在建立混淆矩陣的時候,py的參數是先寫真實值,後寫預測值,所以說其標籤也會有相應的倒置。這個混淆矩陣的結果意味著,在100個測試集中,有兩個屬於「M」(惡性)的細胞被錯誤預測為了「B」(良性)。
註:本案例不提供數據集,如果要學習完整案例,點擊文章底部閱讀原文或者掃描課程二維碼,購買包含數據集+代碼+PPT的《kaggle十大案例精講課程》,購買學員會贈送文章的數據集。
《kaggle十大案例精講課程》提供代碼+數據集+詳細代碼注釋+老師講解PPT!綜合性的提高你的數據能力,數據處理+數據可視化+建模一氣呵成!
Kaggle十大案例精講課程(連載中):
掃描kaggle十大案例課程二維碼,即刻加入課程。