有監督學習python
主要用於決策支持,它利用有標識的歷史數據進行訓練,以實現對新數據的表示的預測算法
1 分類dom
分類計數預測的數據對象是離散的。如短信是否爲垃圾短信,用戶是否喜歡電子產品機器學習
經常使用方法: K近鄰、樸素貝葉斯、決策樹、SVM函數
2 迴歸學習
迴歸技術預測的數據對象是連續值。例如溫度變化或時間變化。包括一元迴歸和多元迴歸,線性迴歸和非線性迴歸spa
經常使用方法: 線性迴歸、邏輯迴歸、嶺迴歸3d
無監督學習rest
主要用於知識發現,在歷史數據中發現隱藏的模式或內在結構excel
1 聚類
聚類算法用於在數據中尋找隱藏的模式或分組。K-means
半監督學習
在半監督學習方式下,訓練數據有部分被標識,部分沒有被標識,這種模型首先須要學習數據的內在結構,以便合理的組織數據來進行預測。算法上,包括一些對經常使用監督式學習算法的延伸,這些算法首先試圖對未標識數據進行建模,在此基礎上再對標識的數據進行預測。
常見方法: 深度學習
KNN概述
簡單來講,K-近鄰算法採用測量不一樣特徵值之間的距離方法進行分類(k-Nearest Neighbor,KNN)
優勢: 精度高、對異常值不敏感、無數據輸入假定
缺點: 時間複雜度高、空間複雜度高
一、當樣本不平衡時,好比一個類的樣本容量很大,其餘類的樣本容量很小,輸入一個樣本的時候,K個臨近值中大多數都是大樣本容量的那個類,這時可能就會致使分類錯誤。改進方法是對K臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。
二、計算量較大,每一個待分類的樣本都要計算它到所有點的距離,根據距離排序才能求得K個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類做用不大的樣本。
適用數據範圍 : 數值型和標稱型
1 標稱型:標稱型目標變量的結果只在有限目標集中取值,如真與假(標稱型目標變量主要用於分類)
2 數值型:數值型目標變量則能夠從無限的數值集合中取值,如0.100,42.001等 (數值型目標變量主要用於迴歸分析)
工做原理
1 樣本訓練集
2 電影類別KNN分析
3 歐幾里得距離(歐式距離)
4 KNN計算過程流程圖
入門案例 : 電影類型分析
電影名稱 動做鏡頭 接吻鏡頭 電影類別 0 前任三 2 15 愛情 1 復仇者聯盟 36 3 動做 2 殺破狼 24 1 動做 3 戰狼 29 2 動做 4 泰坦尼克號 1 18 愛情 5 大話西遊 29 3 愛情 6 星願 2 20 愛情 7 西遊記 25 2 動做 8 七月與安生 3 19 愛情
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt %matplotlib inline #從excel讀取數據 films = pd.read_excel('films.xlsx',sheet_name=1) train = films[['動做鏡頭','接吻鏡頭']] target = films['電影類別'] # 建立機器學習模型 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier() # 對knn模型進行訓練 # 構建函數原型、構建損失函數、求損失函數最優解 knn.fit(train,target) ''' KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=5, p=2, weights='uniform') ''' #輸入兩個案例 cat = np.array([[3,16],[20,4]]) # 使用predict函數對數據進行預測 knn.predict(cat) plt.scatter(train.values[:,0],train.values[:,1]) plt.scatter(cat[:,0],cat[:,1],color='red')
KNN近鄰機器學習案例2
from sklearn.neighbors import KNeighborsClassifier import numpy as np #knn對象 neigh = KNeighborsClassifier(n_neighbors=3) #身高、體重、鞋的尺寸 X = np.array([[181,80,44],[177,70,43],[160,60,38],[154,54,37], [166,65,40],[190,90,47],[175,64,39],[177,70,40], [159,55,37],[171,75,42],[181,85,43]]) display(X) y = ['male','male','female','female','male','male','female','female','female','male','male'] # 第1步:訓練數據 neigh.fit(X,y) # 第2步:預測數據 Z = neigh.predict(np.array([[190,70,43],[168,55,37]])) display(Z) #array(['male', 'female'], dtype='<U6') 識別出對應的性格
用於分類的numpy方法介紹
np.meshgrid 從座標向量返回座標矩陣
import numpy as np nx, ny = 3, 4 x = np.linspace(0, 1, nx) y = np.linspace(0, 1, ny) xv, yv = np.meshgrid(x, y) display(x,y,xv,yv)
輸出:
array([ 0. , 0.5, 1. ])
array([ 0. , 0.33333333, 0.66666667, 1. ])
array([[ 0. , 0.5, 1. ],
[ 0. , 0.5, 1. ], [ 0. , 0.5, 1. ], [ 0. , 0.5, 1. ]])
array([[ 0. , 0. , 0. ],
[ 0.33333333, 0.33333333, 0.33333333],
[ 0.66666667, 0.66666667, 0.66666667],
[ 1. , 1. , 1. ]])
```
np.ravel 返回一個連續的平坦矩陣
x = np.array([[1, 2, 3], [4, 5, 6]]) display(x,x.ravel()) #輸出: array([[1, 2, 3], [4, 5, 6]]) array([1, 2, 3, 4, 5, 6])
np.c_ 將切片對象按第二軸轉換爲串聯
np.c_[np.array([1,2,3]), np.array([4,5,6])] #輸出: array([[1, 4], [2, 5], [3, 6]])
具體操做
# 導入庫:KNeighborsClassifier import numpy as np from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 導入sklearn自帶數據集 from sklearn import datasets # 獲得訓練樣本 iris = datasets.load_iris() X = iris.data[:,:2] y = iris.target #定義三種顏色表明三種藍蝴蝶 cmap_species = ListedColormap(['#FF0000','#00FF00','#0000FF']) #c對應顏色池映射到target值 plt.scatter(X[:,0],X[:,1],c = y,cmap = cmap_species) plt.show()
繪製圖形以後進行KNN
#定義KNN分類器 clf = KNeighborsClassifier(n_neighbors=10) # 第1步:訓練分類器 clf.fit(X,y) # 圖片的顯示範圍,畫布的邊界範圍 x_min, x_max = X[:,0].min()-1, X[:,0].max()+1 y_min, y_max = X[:,1].min()-1, X[:,1].max()+1 # 圖片的背景顯示座標 xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02)) # 第2步:預測 ravel()數據扁平化 Z = clf.predict(np.c_[xx.ravel(),yy.ravel()]) z = Z.reshape(xx.shape) cmap_background = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF']) # 顯示背景的顏色 plt.pcolormesh(xx,yy,z,cmap=cmap_background) # 顯示點的顏色 plt.scatter(X[:,0],X[:,1],c = y,cmap=cmap_species) plt.xlim(xx.min(),xx.max()) plt.ylim(yy.min(),yy.max()) plt.title('3-class classification') plt.show()
import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsRegressor %matplotlib inline x = np.linspace(0,2*np.pi,40) y = np.sin(x) plt.scatter(x,y) plt.xlabel('feature') plt.ylabel('target') # 隨機數種子,用於固定隨機數 np.random.seed(2) noise = np.random.random(size=20) - 0.5 y[::2] += noise plt.scatter(x,y) # 生成knn迴歸模型 # n_neighbors 就是距離預測樣本最近的點的個數 knn = KNeighborsRegressor(n_neighbors=19) knn.fit(x.reshape(-1,1),y) # 獲取預測樣本集 # 預測數據的形狀應該和訓練數據的形狀一致(不要求數量一致,要求特徵一致) X_test = np.linspace(0,2*np.pi,100).reshape(-1,1) y_ = knn.predict(X_test) plt.plot(X_test,y_,color='orange',label='predict') plt.scatter(x,y,color='blue',label='true-data') plt.legend()
# 建立多個算法模型,採用不一樣的參數,查看回歸的結果 knn1 = KNeighborsRegressor(n_neighbors=1) knn2 = KNeighborsRegressor(n_neighbors=7) knn3 = KNeighborsRegressor(n_neighbors=21) knn1.fit(x.reshape(-1,1),y) knn2.fit(x.reshape(-1,1),y) knn3.fit(x.reshape(-1,1),y) y1_ = knn1.predict(X_test) y2_ = knn2.predict(X_test) y3_ = knn3.predict(X_test) # 擬合度太高,稱爲過擬合,對數據分析的過於在乎局部特徵 plt.plot(X_test,y1_,color='orange',label='n_neighbors=1') # 擬合度恰好,稱爲最佳擬合,這是機器學習的終極目標,調參就是爲了達到這個目的 plt.plot(X_test,y2_,color='cyan',label='n_neighbors=7') # 擬合度太差,稱爲欠擬合,對數據特徵分析不透徹,數據有效特徵太少,樣本數量太少 plt.plot(X_test,y3_,color='red',label='n_neighbors=21') plt.scatter(x,y,color='blue',label='true-data') plt.legend()