之前讀《機器學習實戰(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
概念: