機器學習實戰(zhàn)-之KNN篇

之前讀《機器學習實戰(zhàn)》,對很多算法從原理上進行編寫,對學習算法有很大幫助,但效率很低。用pandas和sklearn可以很快的實現算法,效率更高。

1、數據準備

本次實用的數據,如圖所示:


通過對前三列的類別進行分類,來預測未知分類對應的程度,從而達到分類;首先從excel讀取數據,語句如下:

#-*- coding: utf-8 -*-

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

import pandas as pd

data_file = "../data/data.xlsx"

df = pd.read_excel(data_file, encoding="utf-8")

通過這種方法讀取的df,是dataframe類型的數據,相當于二維矩陣,讀取,及操作都需要響應語法。例如,可以通過以下方法讀取類型或數據:

x = df[[u'里程',u'冰淇淋', u'游戲']]

y = df[[u'程度']]

2、數據清洗和數據歸一

數據由于存在質量問題,因此必要的清洗是應該的;另外,不同類型的數據還存在量綱的差別,因此需要對數據進行歸一化才能使得結果更準確。方法如下:

數據清洗:

explore = df.describe().T

print explore

通過此方法,可以查看各屬性數據的空值數、最大最小值等來分析數據可能存在的問題。復雜的時候,還可以寫復合邏輯來查數據不合理的成分,詳見《Python數據分析與挖掘實戰(zhàn)》的第七章,符合來查票價的不合理成分。

數據歸一:

歸一場用的方法是0-均值規(guī)范化:

x = (x-x.mean())/x.std()

或者利用sklearn自帶的方法:

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()

x = ss.fit_transform(x)

3、模型建立

首先將數據拆分成訓練集和測試集:

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x,y,random_state = 1)

其中random_state=1表示每次隨機分成的測試集與訓練集都相同

訓練KNN模型:

knn = neighbors.KNeighborsClassifier()

knn.fit(x_train,y_train)

4、模型預測

y_pred = knn.predict(x_test)

通過此預測得到的數據類型其實是:narray,不是值錢的dataframe,這一點要注意;所以在比較時,要做數據轉換;

5、模型評價

y_pred_array = y_test.values.ravel()

result = y_pred_array - y_pred

temp = 0

for i in result:

? ? if i==0:

? ? ? ? temp += 1

print float(temp)/len(result)

通過將測試集進行模型預測,再跟測試集已知結果進行比對,邊得知模型的準確讀;以上是自己實現的方法,首先是將之前的dataframe類型轉為narray類型,然后用循環(huán)統(tǒng)計兩者做差之后0的數量,即為正確的數量。

或者利用已知的方法來做比對:

print 'The accuracy of K-Nearest Neighbor Classifier is', knn.score(x_test, y_test)

from sklearn.metrics import classification_report

print classification_report(y_test, y_pred)

通過這兩種方法都能得知模型的準確度;

6、補充

#在不歸一化數據時,模型的準確率時:0.796

#歸一化之后,準確率時:0.952

概念:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容