微信公衆號:蘿蔔大雜燴 關注可瞭解更多的原創內容。算法
機器學習,是人工智能(AI)的一部分。是研究如何讓計算機從數據中學習某種規律的科學。數組
能夠簡單的總結成公式爲:bash
歷史數據 + 計算機成功 = 算法模型
將來數據 + 算法模型 = 預測將來事件微信
監督式學習網絡
須要給每一個樣品打標籤,訓練數據包含輸入和預期的輸出。dom
非監督式學習機器學習
不須要標籤,訓練數據只有輸入,沒有預期的輸出。函數
分類的實例應用:學習
迴歸的實例應用:測試
聚類的實例應用:
收集數據 到一些大數據網站或者本身公司軟件收集到的數據。
數據清洗 對獲得的數據,作一些檢查,查看是否有明顯錯誤數據,空數據等。
特徵工程 把數據作一些變換,使得數據可以被程序識別,通常是向量化,提取特徵。
數據預處理 把數據處理成容易被程序識別的形式,如歸一化,標準化等。
選擇算法模型 須要選擇合適的算法模型
訓練調參 是一個迭代的過程,不斷訓練,來達到模型的最優。
模型部署 在線部署。
在一個真實的對象中,提取出咱們關心的特徵。好比物體的形狀,體積等。文字的出現位置等。
對於數據集中的缺失值,須要根據相關信息,來處理缺失數據。使用均值、中間值,或者衆數、類似數等方式來填充缺失值,固然若是缺失值太高,直接丟棄也是能夠的。
歸一化和標準化 歸一化:把數據歸一化爲0到1之間 標準化:把數據標準化爲正態分佈數據
獨熱編碼: 把數據變換爲0或1的值
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]
複製代碼
作 K 最近鄰算法,若是樣本總共分爲 N 類,若是一個未知分類點,距離某一類的距離最近,則該點屬於該類。
K 通常取值爲奇數值,表明選取 K 個點的距離。
kNN 算法的核心思想是若是一個樣本在特徵空間中的 k 個最相鄰的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,並具備這個類別上樣本的特性。--來自百度百科
歐式距離的計算:
二維平面上兩點 a(x1,y1) 與 b(x2,y2) 間的歐氏距離:
三維空間兩點 a(x1,y1,z1)與b(x2,y2,z2) 間的歐氏距離:
兩個 n 維向量 a(x11,x12,…,x1n) 與 b(x21,x22,…,x2n) 間的歐氏距離:
計算歐式距離
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)))
複製代碼
能夠將決策邊界一側的全部點分類爲屬於一個類,而將另外一側的全部點分類爲屬於另外一個類。決策邊界選擇的好壞,直接影響着模型預測的準確程度。
總結:決策邊界過於粗糙,會致使欠擬合,而過於精細,就會有過擬合的風險。
KNN算法中的決策邊界,就是肯定 K 的值,到底選取 K 爲幾纔是最優的解。
爲了肯定 K 的值,能夠採用交叉驗證的方式。 首先,當咱們拿到一組數據以後,先把數據拆分爲訓練集和測試集,訓練集用於訓練模型,測試集用於測試模型的準確率。
測試集不可用於訓練!測試集不可用於訓練!測試集不可用於訓練!(重要的事情吼三遍)
而後,再把訓練集拆分紅訓練集和驗證集。這裏的驗證集,是用來給交叉驗證時使用的。
好比,若是咱們想作5輪交叉驗證,那麼就分別把最原始的訓練集分紅5中狀況,如圖:
接着,分別取 K=1,K=3,K=5 等狀況在上述5種數據集中分別訓練驗證,得出準確率最高的 K 值,此時,咱們就經過交叉驗證的方式,找到了在該數據集下的最優 K 值。
最後,纔會在測試集上作最後的測試,若是模型在測試集上達到了咱們預期的準確率,則模型可用。
歡迎關注個人微信公衆號--蘿蔔大雜燴,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!