機器學習簡介及Hello World級別算法KNN

微信公衆號:蘿蔔大雜燴 關注可瞭解更多的原創內容。算法

1. 機器學習簡介

1. 什麼是機器學習

機器學習,是人工智能(AI)的一部分。是研究如何讓計算機從數據中學習某種規律的科學。數組

  • 計算機程序根據給定的數據,去優化某一個評價指標
  • 自動的從數據中發現規律
  • 使用規律預測將來(未知)的事務,事件等

能夠簡單的總結成公式爲:bash

歷史數據 + 計算機成功 = 算法模型
將來數據 + 算法模型 = 預測將來事件微信

2. 機器學習分類

監督式學習網絡

須要給每一個樣品打標籤,訓練數據包含輸入和預期的輸出。dom

  • 分類 標籤都是離散值
  • 迴歸 標籤都是連續值

非監督式學習機器學習

不須要標籤,訓練數據只有輸入,沒有預期的輸出。函數

  • 聚類 是指把對象分紅不一樣的子集,使得屬於同一個子集的對象都有一些相同的屬性。

分類的實例應用:學習

  • 垃圾郵件/短信檢測
  • 自動車牌號識別
  • 人臉識別
  • 手寫字符識別
  • 語音識別
  • 醫療圖片的病症診斷

迴歸的實例應用:測試

  • 自動爲二手車估價
  • 預測股票價格
  • 預測將來氣溫
  • 自動駕駛

聚類的實例應用:

  • 客戶分類(市場研究)
  • 用戶分組(社交網絡)
  • 圖像分割
  • 推薦系統
  • 消除歧義(天然語言處理)

3. 機器學習基本流程

  1. 收集數據 到一些大數據網站或者本身公司軟件收集到的數據。

  2. 數據清洗 對獲得的數據,作一些檢查,查看是否有明顯錯誤數據,空數據等。

  3. 特徵工程 把數據作一些變換,使得數據可以被程序識別,通常是向量化,提取特徵。

  4. 數據預處理 把數據處理成容易被程序識別的形式,如歸一化,標準化等。

  5. 選擇算法模型 須要選擇合適的算法模型

  6. 訓練調參 是一個迭代的過程,不斷訓練,來達到模型的最優。

  7. 模型部署 在線部署。

4. 數據預處理

  • 特徵提取
  • 處理缺失數據
  • 數據定標
  • 數據轉換

1. 特徵提取

在一個真實的對象中,提取出咱們關心的特徵。好比物體的形狀,體積等。文字的出現位置等。

2. 缺失數據處理

對於數據集中的缺失值,須要根據相關信息,來處理缺失數據。使用均值、中間值,或者衆數、類似數等方式來填充缺失值,固然若是缺失值太高,直接丟棄也是能夠的。

3. 數據定標

歸一化和標準化 歸一化:把數據歸一化爲0到1之間 標準化:把數據標準化爲正態分佈數據

4. 數據轉換

獨熱編碼: 把數據變換爲0或1的值

5. 實戰-讀取數據和可視化

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
複製代碼

使用 pandas 讀取 csv 文件

data = pd.read_csv('Advertising.csv')
data.head()
複製代碼

output

使用圖表來展現數據,這樣可以更加直觀的查看數據分佈等信息

plt.figure(figsize=(16, 8))
plt.scatter(data['TV'], data['sales'], c ='black')
plt.xlabel("Money spent on TV ads")
plt.ylabel("Sales")
plt.show()
複製代碼

output

海拔高度與溫度的預測練習

h_data = pd.read_csv('height.csv')
h_data
plt.figure()
plt.scatter(h_data['height'], h_data['temperature'])
plt.xlabel('height')
plt.ylabel('temperature')
plt.show()
h_X = h_data['height'].values.reshape(-1, 1)
h_y = h_data['temperature'].values.reshape(-1, 1)
h_reg = LinearRegression()
h_reg.fit(h_X, h_y)
print("線性模型爲: Y = {:.5}X + {:.5} ".format(h_reg.coef_[0][0], h_reg.intercept_[0]))
h_height = h_reg.predict([[8000]])
h_height[0][0]
複製代碼

2. 「Hello world」 級別算法-KNN

1. 什麼是 KNN 算法

作 K 最近鄰算法,若是樣本總共分爲 N 類,若是一個未知分類點,距離某一類的距離最近,則該點屬於該類。

K 通常取值爲奇數值,表明選取 K 個點的距離。

kNN 算法的核心思想是若是一個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。--來自百度百科

2. 距離的計算

歐式距離的計算:

二維平面上兩點 a(x1,y1) 與 b(x2,y2) 間的歐氏距離:

d_{12}= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

三維空間兩點 a(x1,y1,z1)與b(x2,y2,z2) 間的歐氏距離:

d_{12}= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}

兩個 n 維向量 a(x11,x12,…,x1n) 與 b(x21,x22,…,x2n) 間的歐氏距離:

d_{12}= \sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^2}

3. 手寫 KNN 算法

計算歐式距離

def euc_dis(instance1, instance2):
    dist = np.sqrt(sum((instance1 - instance2)**2))
    return dist
複製代碼

dist 的計算就是,求兩個向量差的平方和,再取平方根。

咱們可使用 numpy 庫自帶的公式來驗證下

import numpy as np

def euc_dis(instance1, instance2):
    dist = np.sqrt(sum((instance1 - instance2)**2))
    return dist

vec1 = np.array([2, 3])
vec2 = np.array([5, 6])
euc_dis(vec1, vec2)

np.linalg.norm(vec1 - vec2)
複製代碼

最後的結果都是 4.242640687119285

實現 KNN 算法

def knn_classify(X, y, testdata, k):
    distances = [euc_dis(x, testdata) for x in X]
    kneighbors = np.argsort(distances)[:k]
    count = Counter(y[kneighbors])
    return count.most_common()[0][0]
複製代碼

argsort 函數返回的是數組值從小到大的索引值,most_common 函數用來實現 Top n 功能。

來看下這兩個函數的具體實例

argsort

test_data1 = np.array([2, 1, 5, 0])
np.argsort(test_data1)
複製代碼

output

array([3, 1, 0, 2], dtype=int32)
複製代碼

返回的數組依次爲最小值0的索引位置3,依次類推

most_common

from collections import Counter
test_data2 = Counter("abcdabcab")
test_data2.most_common(2)
複製代碼

output

[('a', 3), ('b', 3)]
複製代碼

返回出現次數最多的 top n

使用手寫的 KNN 算法作預測

# 導入iris數據
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)

# 預測結果。 
predictions = [knn_classify(X_train, y_train, data, 3) for data in X_test]
print(predictions)
correct = np.count_nonzero((predictions==y_test)==True)
print(correct)
print ("Accuracy is: %.3f" %(correct/len(X_test)))
複製代碼

4. K 值的選擇(調參)

1. 決策邊界

能夠將決策邊界一側的全部點分類爲屬於一個類,而將另外一側的全部點分類爲屬於另外一個類。決策邊界選擇的好壞,直接影響着模型預測的準確程度。

總結:決策邊界過於粗糙,會致使欠擬合,而過於精細,就會有過擬合的風險。

KNN算法中的決策邊界,就是肯定 K 的值,到底選取 K 爲幾纔是最優的解。

2. 交叉驗證

爲了肯定 K 的值,能夠採用交叉驗證的方式。 首先,當咱們拿到一組數據以後,先把數據拆分爲訓練集和測試集,訓練集用於訓練模型,測試集用於測試模型的準確率。

測試集不可用於訓練!測試集不可用於訓練!測試集不可用於訓練!(重要的事情吼三遍)

而後,再把訓練集拆分紅訓練集和驗證集。這裏的驗證集,是用來給交叉驗證時使用的。

好比,若是咱們想作5輪交叉驗證,那麼就分別把最原始的訓練集分紅5中狀況,如圖:

接着,分別取 K=1,K=3,K=5 等狀況在上述5種數據集中分別訓練驗證,得出準確率最高的 K 值,此時,咱們就經過交叉驗證的方式,找到了在該數據集下的最優 K 值。

最後,纔會在測試集上作最後的測試,若是模型在測試集上達到了咱們預期的準確率,則模型可用。

歡迎關注個人微信公衆號--蘿蔔大雜燴,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!

相關文章
相關標籤/搜索