機(jī)器學(xué)習(xí)(算法篇)完整教程(附代碼資料)主要內(nèi)容講述:機(jī)器學(xué)習(xí)算法課程定位、目標(biāo),K-近鄰算法定位,目標(biāo),學(xué)習(xí)目標(biāo),1 什么是K-近鄰算法,1 Scikit-learn工具介紹,2 K-近鄰算法API。K-近鄰算法,1.4 k值的選擇學(xué)習(xí)目標(biāo),學(xué)習(xí)目標(biāo),1 kd樹簡(jiǎn)介,2 構(gòu)造方法,3 案例分析,4 總結(jié)。K-近鄰算法,1.6 案例:鳶尾花種類預(yù)測(cè)--數(shù)據(jù)集介紹學(xué)習(xí)目標(biāo),1 案例:鳶尾花種類預(yù)測(cè),2 scikit-learn中數(shù)據(jù)集介紹,1 什么是特征預(yù)處理,2 歸一化,3 標(biāo)準(zhǔn)化。K-近鄰算法,1.8 案例:鳶尾花種類預(yù)測(cè)—流程實(shí)現(xiàn)學(xué)習(xí)目標(biāo),1 再識(shí)K-近鄰算法API,2 案例:鳶尾花種類預(yù)測(cè),總結(jié),1 什么是交叉驗(yàn)證(cross validation),2 什么是網(wǎng)格搜索(Grid Search)。線性回歸,2.1 線性回歸簡(jiǎn)介學(xué)習(xí)目標(biāo),1 線性回歸應(yīng)用場(chǎng)景,2 什么是線性回歸,1 線性回歸API,2 舉例,1 常見函數(shù)的導(dǎo)數(shù)。線性回歸,2.6 梯度下降法介紹學(xué)習(xí)目標(biāo),1 全梯度下降算法(FG),2 隨機(jī)梯度下降算法(SG),3 小批量梯度下降算法(mini-bantch),4 隨機(jī)平均梯度下降算法(SAG),5 算法比較。線性回歸,2.8 欠擬合和過擬合學(xué)習(xí)目標(biāo),1 定義,2 原因以及解決辦法,3 正則化,4 維災(zāi)難【拓展知識(shí)】。線性回歸,2.9 正則化線性模型學(xué)習(xí)目標(biāo),1 Ridge Regression (嶺回歸,又名 Tikhonov regularization),2 Lasso Regression(Lasso 回歸),3 Elastic Net (彈性網(wǎng)絡(luò)),4 Early Stopping [了解],1 API。邏輯回歸,3.4 分類評(píng)估方法學(xué)習(xí)目標(biāo),1.分類評(píng)估方法,2 ROC曲線與AUC指標(biāo),3 總結(jié),1 曲線繪制,2 意義解釋。決策樹算法,4.4 特征工程-特征提取學(xué)習(xí)目標(biāo),1 特征提取,2 字典特征提取,3 文本特征提取。決策樹算法,4.5 決策樹算法api學(xué)習(xí)目標(biāo),1 泰坦尼克號(hào)數(shù)據(jù),2 步驟分析,3 代碼過程,3 決策樹可視化,學(xué)習(xí)目標(biāo)。集成學(xué)習(xí),5.3 Boosting學(xué)習(xí)目標(biāo),1.boosting集成原理,2 GBDT(了解),3.XGBoost【了解】,4 什么是泰勒展開式【拓展】,學(xué)習(xí)目標(biāo)。聚類算法,6.4 模型評(píng)估學(xué)習(xí)目標(biāo),1 誤差平方和(SSE \The sum of squares due to error):,2 “肘”方法 (Elbow method) — K值確定,3 輪廓系數(shù)法(Silhouette Coefficient),4 CH系數(shù)(Calinski-Harabasz Index),5 總結(jié)。聚類算法,6.6 特征降維學(xué)習(xí)目標(biāo),1 降維,2 特征選擇,3 主成分分析,1 需求,2 分析。
全套筆記資料代碼移步: 前往gitee倉庫查看
感興趣的小伙伴可以自取哦,歡迎大家點(diǎn)贊轉(zhuǎn)發(fā)~
全套教程部分目錄:
部分文件圖片:
K-近鄰算法
學(xué)習(xí)目標(biāo)
- 掌握K-近鄰算法實(shí)現(xiàn)過程
- 知道K-近鄰算法的距離公式
- 知道K-近鄰算法的超參數(shù)K值以及取值問題
- 知道kd樹實(shí)現(xiàn)搜索的過程
- 應(yīng)用KNeighborsClassifier實(shí)現(xiàn)分類
- 知道K-近鄰算法的優(yōu)缺點(diǎn)
- 知道交叉驗(yàn)證實(shí)現(xiàn)過程
- 知道超參數(shù)搜索過程
- 應(yīng)用GridSearchCV實(shí)現(xiàn)算法參數(shù)的調(diào)優(yōu)
1.8 案例:鳶尾花種類預(yù)測(cè)—流程實(shí)現(xiàn)
1 再識(shí)K-近鄰算法API
-
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
-
n_neighbors:
- int,可選(默認(rèn)= 5),k_neighbors查詢默認(rèn)使用的鄰居數(shù)
-
algorithm:{‘a(chǎn)uto’,‘ball_tree’,‘kd_tree’,‘brute’}
-
快速k近鄰搜索算法,默認(rèn)參數(shù)為auto,可以理解為算法自己決定合適的搜索算法。除此之外,用戶也可以自己指定搜索算法ball_tree、kd_tree、brute方法進(jìn)行搜索,
- brute是蠻力搜索,也就是線性掃描,當(dāng)訓(xùn)練集很大時(shí),計(jì)算非常耗時(shí)。
- kd_tree,構(gòu)造kd樹存儲(chǔ)數(shù)據(jù)以便對(duì)其進(jìn)行快速檢索的樹形數(shù)據(jù)結(jié)構(gòu),kd樹也就是數(shù)據(jù)結(jié)構(gòu)中的二叉樹。以中值切分構(gòu)造的樹,每個(gè)結(jié)點(diǎn)是一個(gè)超矩形,在維數(shù)小于20時(shí)效率高。
- ball tree是為了克服kd樹高緯失效而發(fā)明的,其構(gòu)造過程是以質(zhì)心C和半徑r分割樣本空間,每個(gè)節(jié)點(diǎn)是一個(gè)超球體。
-
2 案例:鳶尾花種類預(yù)測(cè)
2.1 數(shù)據(jù)集介紹
Iris數(shù)據(jù)集是常用的分類實(shí)驗(yàn)數(shù)據(jù)集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉數(shù)據(jù)集,是一類多重變量分析的數(shù)據(jù)集。關(guān)于數(shù)據(jù)集的具體介紹:
2.2 步驟分析
- 1.獲取數(shù)據(jù)集
- 2.數(shù)據(jù)基本處理
- 3.特征工程
- 4.機(jī)器學(xué)習(xí)(模型訓(xùn)練)
- 5.模型評(píng)估
2.3 代碼過程
- 導(dǎo)入模塊
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
- 先從sklearn當(dāng)中獲取數(shù)據(jù)集,然后進(jìn)行數(shù)據(jù)集的分割
# 1.獲取數(shù)據(jù)集
iris = load_iris()
# 2.數(shù)據(jù)基本處理
# x_train,x_test,y_train,y_test為訓(xùn)練集特征值、測(cè)試集特征值、訓(xùn)練集目標(biāo)值、測(cè)試集目標(biāo)值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
-
進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化
-
特征值的標(biāo)準(zhǔn)化
# 3、特征工程:標(biāo)準(zhǔn)化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
- 模型進(jìn)行訓(xùn)練預(yù)測(cè)
# 4、機(jī)器學(xué)習(xí)(模型訓(xùn)練)
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5、模型評(píng)估
# 方法1:比對(duì)真實(shí)值和預(yù)測(cè)值
y_predict = estimator.predict(x_test)
print("預(yù)測(cè)結(jié)果為:\n", y_predict)
print("比對(duì)真實(shí)值和預(yù)測(cè)值:\n", y_predict == y_test)
# 方法2:直接計(jì)算準(zhǔn)確率
score = estimator.score(x_test, y_test)
print("準(zhǔn)確率為:\n", score)
1.9 練一練
同學(xué)之間討論剛才完成的機(jī)器學(xué)習(xí)代碼,并且確保在自己的電腦是哪個(gè)運(yùn)行成功
總結(jié)
-
在本案例中,具體完成內(nèi)容有:
-
使用可視化加載和探索數(shù)據(jù),以確定特征是否能將不同類別分開。
- 通過標(biāo)準(zhǔn)化數(shù)字特征并隨機(jī)抽樣到訓(xùn)練集和測(cè)試集來準(zhǔn)備數(shù)據(jù)。
-
通過統(tǒng)計(jì)學(xué),精確度度量進(jìn)行構(gòu)建和評(píng)估機(jī)器學(xué)習(xí)模型。
-
k近鄰算法總結(jié)
-
優(yōu)點(diǎn):
- 簡(jiǎn)單有效
- 重新訓(xùn)練的代價(jià)低
-
適合類域交叉樣本
- KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對(duì)于類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
-
適合大樣本自動(dòng)分類
- 該算法比較適用于樣本容量比較大的類域的自動(dòng)分類,而那些樣本容量較小的類域采用這種算法比較容易產(chǎn)生誤分。
-
缺點(diǎn):
-
惰性學(xué)習(xí)
- KNN算法是懶散學(xué)習(xí)方法(lazy learning,基本上不學(xué)習(xí)),一些積極學(xué)習(xí)的算法要快很多
-
類別評(píng)分不是規(guī)格化
- 不像一些通過概率評(píng)分的分類
-
輸出可解釋性不強(qiáng)
- 例如決策樹的輸出可解釋性就較強(qiáng)
-
對(duì)不均衡的樣本不擅長
- 當(dāng)樣本不平衡時(shí),如一個(gè)類的樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的K個(gè)鄰居中大容量類的樣本占多數(shù)。該算法只計(jì)算“最近的”鄰居樣本,某一類的樣本數(shù)量很大,那么或者這類樣本并不接近目標(biāo)樣本,或者這類樣本很靠近目標(biāo)樣本。無論怎樣,數(shù)量并不能影響運(yùn)行結(jié)果??梢圆捎脵?quán)值的方法(和該樣本距離小的鄰居權(quán)值大)來改進(jìn)。
-
計(jì)算量較大
- 目前常用的解決方法是事先對(duì)已知樣本點(diǎn)進(jìn)行剪輯,事先去除對(duì)分類作用不大的樣本。
-
1.10 交叉驗(yàn)證,網(wǎng)格搜索
1 什么是交叉驗(yàn)證(cross validation)
交叉驗(yàn)證:將拿到的訓(xùn)練數(shù)據(jù),分為訓(xùn)練和驗(yàn)證集。以下圖為例:將數(shù)據(jù)分成4份,其中一份作為驗(yàn)證集。然后經(jīng)過4次(組)的測(cè)試,每次都更換不同的驗(yàn)證集。即得到4組模型的結(jié)果,取平均值作為最終結(jié)果。又稱4折交叉驗(yàn)證。
1.1 分析
我們之前知道數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,但是為了讓從訓(xùn)練得到模型結(jié)果更加準(zhǔn)確。做以下處理
- 訓(xùn)練集:訓(xùn)練集+驗(yàn)證集
- 測(cè)試集:測(cè)試集
1.2 為什么需要交叉驗(yàn)證
交叉驗(yàn)證目的:為了讓被評(píng)估的模型更加準(zhǔn)確可信
問題:那么這個(gè)只是對(duì)于參數(shù)得出更好的結(jié)果,那么怎么選擇或者調(diào)優(yōu)參數(shù)呢?
2 什么是網(wǎng)格搜索(Grid Search)
通常情況下,有很多參數(shù)是需要手動(dòng)指定的(如k-近鄰算法中的K值),這種叫超參數(shù)。但是手動(dòng)過程繁雜,所以需要對(duì)模型預(yù)設(shè)幾種超參數(shù)組合。每組超參數(shù)都采用交叉驗(yàn)證來進(jìn)行評(píng)估。最后選出最優(yōu)參數(shù)組合建立模型。
3 交叉驗(yàn)證,網(wǎng)格搜索(模型選擇與調(diào)優(yōu))API:
-
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
-
對(duì)估計(jì)器的指定參數(shù)值進(jìn)行詳盡搜索
- estimator:估計(jì)器對(duì)象
- param_grid:估計(jì)器參數(shù)(dict){“n_neighbors”:[1,3,5]}
- cv:指定幾折交叉驗(yàn)證
- fit:輸入訓(xùn)練數(shù)據(jù)
- score:準(zhǔn)確率
-
結(jié)果分析:
- bestscore__:在交叉驗(yàn)證中驗(yàn)證的最好結(jié)果
- bestestimator:最好的參數(shù)模型
- cvresults:每次交叉驗(yàn)證后的驗(yàn)證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果
4 鳶尾花案例增加K值調(diào)優(yōu)
- 使用GridSearchCV構(gòu)建估計(jì)器
# 1、獲取數(shù)據(jù)集
iris = load_iris()
# 2、數(shù)據(jù)基本處理 -- 劃分?jǐn)?shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、特征工程:標(biāo)準(zhǔn)化
# 實(shí)例化一個(gè)轉(zhuǎn)換器類
transfer = StandardScaler()
# 調(diào)用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、KNN預(yù)估器流程
# 4.1 實(shí)例化預(yù)估器類
estimator = KNeighborsClassifier()
# 4.2 模型選擇與調(diào)優(yōu)——網(wǎng)格搜索和交叉驗(yàn)證
# 準(zhǔn)備要調(diào)的超參數(shù)
param_dict = {"n_neighbors": [1, 3, 5]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
# 4.3 fit數(shù)據(jù)進(jìn)行訓(xùn)練
estimator.fit(x_train, y_train)
# 5、評(píng)估模型效果
# 方法a:比對(duì)預(yù)測(cè)結(jié)果和真實(shí)值
y_predict = estimator.predict(x_test)
print("比對(duì)預(yù)測(cè)結(jié)果和真實(shí)值:\n", y_predict == y_test)
# 方法b:直接計(jì)算準(zhǔn)確率
score = estimator.score(x_test, y_test)
print("直接計(jì)算準(zhǔn)確率:\n", score)
- 然后進(jìn)行評(píng)估查看最終選擇的結(jié)果和交叉驗(yàn)證的結(jié)果
print("在交叉驗(yàn)證中驗(yàn)證的最好結(jié)果:\n", estimator.best_score_)
print("最好的參數(shù)模型:\n", estimator.best_estimator_)
print("每次交叉驗(yàn)證后的準(zhǔn)確率結(jié)果:\n", estimator.cv_results_)
- 最終結(jié)果
比對(duì)預(yù)測(cè)結(jié)果和真實(shí)值:
[ True True True True True True True False True True True True
True True True True True True False True True True True True
True True True True True True True True True True True True
True True]
直接計(jì)算準(zhǔn)確率:
0.947368421053
在交叉驗(yàn)證中驗(yàn)證的最好結(jié)果:
0.973214285714
最好的參數(shù)模型:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')
每次交叉驗(yàn)證后的準(zhǔn)確率結(jié)果:
{'mean_fit_time': array([ 0.00114751, 0.00027037, 0.00024462]), 'std_fit_time': array([ 1.13901511e-03, 1.25300249e-05, 1.11011951e-05]), 'mean_score_time': array([ 0.00085751, 0.00048693, 0.00045625]), 'std_score_time': array([ 3.52785082e-04, 2.87650037e-05, 5.29673344e-06]), 'param_n_neighbors': masked_array(data = [1 3 5],
mask = [False False False],
fill_value = ?)
, 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}], 'split0_test_score': array([ 0.97368421, 0.97368421, 0.97368421]), 'split1_test_score': array([ 0.97297297, 0.97297297, 0.97297297]), 'split2_test_score': array([ 0.94594595, 0.89189189, 0.97297297]), 'mean_test_score': array([ 0.96428571, 0.94642857, 0.97321429]), 'std_test_score': array([ 0.01288472, 0.03830641, 0.00033675]), 'rank_test_score': array([2, 3, 1], dtype=int32), 'split0_train_score': array([ 1. , 0.95945946, 0.97297297]), 'split1_train_score': array([ 1. , 0.96 , 0.97333333]), 'split2_train_score': array([ 1. , 0.96, 0.96]), 'mean_train_score': array([ 1. , 0.95981982, 0.96876877]), 'std_train_score': array([ 0. , 0.00025481, 0.0062022 ])}
1.11 案例2:預(yù)測(cè)facebook簽到位置
1 數(shù)據(jù)集介紹
數(shù)據(jù)介紹:將根據(jù)用戶的位置,準(zhǔn)確性和時(shí)間戳預(yù)測(cè)用戶正在查看的業(yè)務(wù)。
train.csv,test.csv
row_id:登記事件的ID
xy:坐標(biāo)
準(zhǔn)確性:定位準(zhǔn)確性
時(shí)間:時(shí)間戳
place_id:業(yè)務(wù)的ID,這是您預(yù)測(cè)的目標(biāo)
官網(wǎng):[
2 步驟分析
-
對(duì)于數(shù)據(jù)做一些基本處理(這里所做的一些處理不一定達(dá)到很好的效果,我們只是簡(jiǎn)單嘗試,有些特征我們可以根據(jù)一些特征選擇的方式去做處理)
-
1 縮小數(shù)據(jù)集范圍 DataFrame.query()
-
2 選取有用的時(shí)間特征
-
3 將簽到位置少于n個(gè)用戶的刪除
-
分割數(shù)據(jù)集
-
標(biāo)準(zhǔn)化處理文章來源:http://www.zghlxwxcb.cn/news/detail-849078.html
-
k-近鄰預(yù)測(cè)文章來源地址http://www.zghlxwxcb.cn/news/detail-849078.html
3 代碼過程
- 1.獲取數(shù)據(jù)集
# 1、獲取數(shù)據(jù)集
facebook = pd.read_csv("./data/FBlocation/train.csv")
- 2.基本數(shù)據(jù)處理
# 2.基本數(shù)據(jù)處理
# 2.1 縮小數(shù)據(jù)范圍
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
# 2.2 選擇時(shí)間特征
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
# 2.3 去掉簽到較少的地方
place_count = facebook_data.groupby("place_id").count()
place_count = place_count[place_count["row_id"]>3]
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
# 2.4 確定特征值和目標(biāo)值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook_data["place_id"]
# 2.5 分割數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
- 特征工程--特征預(yù)處理(標(biāo)準(zhǔn)化)
# 3.特征工程--特征預(yù)處理(標(biāo)準(zhǔn)化)
# 3.1 實(shí)例化一個(gè)轉(zhuǎn)換器
transfer = StandardScaler()
# 3.2 調(diào)用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
- 機(jī)器學(xué)習(xí)--knn+cv
# 4.機(jī)器學(xué)習(xí)--knn+cv
# 4.1 實(shí)例化一個(gè)估計(jì)器
estimator = KNeighborsClassifier()
# 4.2 調(diào)用gridsearchCV
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 4.3 模型訓(xùn)練
estimator.fit(x_train, y_train)
- 模型評(píng)估
# 5.模型評(píng)估
# 5.1 基本評(píng)估方式
score = estimator.score(x_test, y_test)
print("最后預(yù)測(cè)的準(zhǔn)確率為:\n", score)
y_predict = estimator.predict(x_test)
print("最后的預(yù)測(cè)值為:\n", y_predict)
print("預(yù)測(cè)值和真實(shí)值的對(duì)比情況:\n", y_predict == y_test)
# 5.2 使用交叉驗(yàn)證后的評(píng)估方式
print("在交叉驗(yàn)證中驗(yàn)證的最好結(jié)果:\n", estimator.best_score_)
print("最好的參數(shù)模型:\n", estimator.best_estimator_)
print("每次交叉驗(yàn)證后的驗(yàn)證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果:\n",estimator.cv_results_)
未完待續(xù), 同學(xué)們請(qǐng)等待下一期
全套筆記資料代碼移步: 前往gitee倉庫查看
感興趣的小伙伴可以自取哦,歡迎大家點(diǎn)贊轉(zhuǎn)發(fā)~
到了這里,關(guān)于【機(jī)器學(xué)習(xí)】機(jī)器學(xué)習(xí)創(chuàng)建算法第4篇:K-近鄰算法,學(xué)習(xí)目標(biāo)【附代碼文檔】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!