1. 程式人生 > >跟 Google 學 machineLearning [1]

跟 Google 學 machineLearning [1]

方法 valid tar dex [] 訓練 發展 好的 set

時至今日,我才發現 machineLearning 的應用門檻已經被降到了這麽低,簡直唾手可得。我實在找不到任何理由不對它進入深入了解。如標題,感謝 Google 為這項技術發展作出的貢獻。當然,可能其他人做了 99%, Google 只做了 1%,我想說,真是漂亮的 1%。

切入正題,今天從 Youtube 上跟隨 Google 的工程師完成了第一個 machineLearning 的小程序。作為學習這項技能的 hello world 吧。

是為記錄。

 1 from scipy.spatial import distance
 2 def euc(a,b):
 3     return
distance.(a,b) 4 5 class knnClassifier(): 6 def fit(self, x_train, y_train): 7 self.x_train = x_train 8 self.y_train = y_train 9 10 def predict(self, x_test): 11 predictions = [] 12 for row in x_test: 13 label = self.closest(row)
14 predictions.append(label) 15 return predictions 16 17 def closest(self, row): 18 best_dist = euc(row, self.x_train[0]) 19 best_index = 0 20 for i in range(1, len(self.x_train)): 21 dist = euc(row, self.x_train[i]) 22 if
dist < best_dist: 23 best_dist = dist 24 best_index = i 25 return self.y_train[best_index] 26 27 from sklearn import datasets 28 iris = datasets.load_iris() 29 x = iris.data 30 y = iris.target 31 32 from sklearn.cross_validation import train_test_split 33 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= .5) 34 print x_train 35 print y_train 36 37 my_classifier = knnClassifier() 38 my_classifier.fit(x_train, y_train) 39 predictions = my_classifier.predict(x_test) 40 41 from sklearn.metrics import accuracy_score 42 print accuracy_score(y_test, predictions)

對上面的代碼進行簡單解釋:

1. 1-3 行是引用 scipy 的 distance 類中計算歐氏距離的函數,並進行了簡單封裝。(歐氏距離:N 維空間中,兩個點之間的真實距離)

2. 5-25 中,定義了自己的 classifier 類,關鍵方法包括了 fit 和 predict。fit 主要是將餵進來的數據賦值給內部變量;predict 是根據送進來的 row,返回我們預期的 Label。這裏的 classifier 是我們 hand code 的,並不是訓練出來的。事實上並不算是真正意義上的 machineLearning,但是很好的解釋了其內部的原理。machineLearning 中,我們定義的 closet 函數,將通過訓練的到,即 model

3. 27-30, 在入了 sklearn 庫中的 iris 花的數據庫,作為我們後面實驗的數據來源。iris_data 是三種花的原始數據,是一個三維數組。數組中每個元素代表一朵花的三個參數,分別是花的xx長度,花的xx寬度,和xx長度(我並不關系他是什麽數據,反正是花的數據);iris_target 是 data 相對應的花的種類,大概就是0表示紅玫瑰,1表示藍玫瑰,2表示粉玫瑰之類。

4. 32-35, 把載入的花朵數據 split 為兩組,一組用做 train,作為預測的憑據,另一組作為檢驗 classifier 準確性的待測數據。驗證時,因為驗證組的數據對應的結果也是已知的,所以拿 classifier 出來的結果與真實值比較,便可知 classifier 是否合理。使用上面代碼進行判定的成功率已經達到 >90%,事實上拿它來對未知新數據判定,結果可信度已經很高。

5. 37-39 ,應用了在 2 中定義的 classifier,將 4 中分割出來的 x_train, y_train 餵給 classifier。然後,使用 classifier 根據 x_test 中的花的數據,預測花的種類,得到對應的預測結果數組 predictions。

6. 41-42,比較真實的花的種類 y_test 與 預測結果 predictions 之間的符合度。可以看到並不是 100%,信息總是會有遺漏的,哪怕是人眼來判斷也一樣。

因為載入的數據在 split 時,是隨機的。所以,因為 train 組和 test 組數據的不同,預測的準確度也會稍有不同。

雖然這裏的 classifier 已經有了很高的準確度,但是,不能回避的是,這樣的計算比對,運算量是非常大的。同時,因為我們數據屬性的關系,我們可以直接通過找最接近數據來進行預測,在其他一些應用中,某些屬性並不是線性分布的,或者,並不是憑人眼能發現規律的。這時候,就需要真正的 train 了。

跟 Google 學 machineLearning [1]