機(jī)器學(xué)習(xí)已經(jīng)成為人工智能中發(fā)展最快,應(yīng)用最廣、最重要的分支之一。但是這條學(xué)習(xí)之路似乎并不是那么容易,也不總是一帆風(fēng)順的。
相信每一個(gè)學(xué)習(xí)機(jī)器學(xué)習(xí)的小伙伴都碼過不少的學(xué)習(xí)資源,無論是在線課程還是大佬們整理的學(xué)習(xí)PPT,但是看的速度遠(yuǎn)不及碼的速度;有的同學(xué)數(shù)學(xué)基礎(chǔ)比較差,就想先把數(shù)學(xué)補(bǔ)足再學(xué)習(xí),但是往往數(shù)學(xué)也沒補(bǔ)上來,機(jī)器學(xué)習(xí)還沒開始就已經(jīng)放棄了;還有很多同學(xué)看到現(xiàn)在深度學(xué)習(xí)聲勢最盛,直接學(xué)習(xí)深度學(xué)習(xí),結(jié)果發(fā)現(xiàn)學(xué)習(xí)到的內(nèi)容也像空中樓閣,不扎實(shí)。
無論是數(shù)學(xué)知識、經(jīng)典與重要的算法還是編碼實(shí)踐,每天都會有人在路上敗下陣來而放棄學(xué)習(xí),仿佛我們永遠(yuǎn)都停留在入門階段。
其實(shí)機(jī)器學(xué)習(xí)涵蓋的知識面非常多,而且不僅要學(xué)習(xí)理論還有實(shí)踐同樣不能忽視。如果基礎(chǔ)薄弱,學(xué)習(xí)起來肯定是會遇到很多困難的,但就一定不行嗎?如何在基礎(chǔ)薄弱的條件下進(jìn)行有效的學(xué)習(xí)是很多人都非常關(guān)心的。至此特此根據(jù)作者Avik-Hain 的博客為大家精心準(zhǔn)備了“機(jī)器學(xué)習(xí)百天大作戰(zhàn)”的系列學(xué)習(xí)計(jì)劃與教程,從理論與實(shí)踐結(jié)合,在100天左右的時(shí)間里從理論+實(shí)踐結(jié)合的方式,有條理有邏輯的幫助大家完成入門,助攻進(jìn)階。相信大家一定可以受益頗多!
本期內(nèi)容是此系列的第一期,主要內(nèi)容有:
數(shù)據(jù)處理的實(shí)踐流程
簡單的線性回歸與實(shí)現(xiàn)
多元線性回歸與實(shí)踐
Logistic 回歸及實(shí)踐
支持向量機(jī) SVM 及其實(shí)現(xiàn)
KNN 算法與實(shí)現(xiàn)
決策樹模型與實(shí)現(xiàn)
Day 1
數(shù)據(jù)處理
機(jī)器學(xué)習(xí)中的數(shù)據(jù)處理實(shí)踐流程主要如下:
第一步:導(dǎo)入所需的庫。Numpy 和 Pandas 是兩個(gè)必需的,也是最基本的數(shù)據(jù)處理庫。
importnumpyasnpimportpandasaspd
第二步:導(dǎo)入數(shù)據(jù)集。數(shù)據(jù)集通常是 .csv 的格式。一個(gè) csv 文件能夠儲存表格數(shù)據(jù),每行都代表一條數(shù)據(jù),我們可以使用 Pandas 中的 read_csv 方法來讀取 csv 文件并將其作為 dataframe 處理。隨后,我們可以將 dataframe 中的矩陣、向量和標(biāo)量分離開來單獨(dú)處理。
dataset=pd.read_csv('Data.csv')X=dataset.iloc[:,:-1].valuesY=dataset.iloc[:,3].values
第三步:處理缺失數(shù)據(jù)。數(shù)據(jù)通常會因?yàn)橐恍┰蚨笔?,我們需要對其進(jìn)行處理以便其不會對機(jī)器學(xué)習(xí)模型的性能造成影響。我們可以通過對整列數(shù)據(jù)進(jìn)行平均化或中值化來填補(bǔ)缺失數(shù)據(jù),這可以通過 sklearn.preprocessing 中的 Imputer 類方法來解決這個(gè)問題。
fromsklearn.preprocessingimportImputerimputer=Imputer(missing_values="NaN",strategy="mean",axis=0)imputer=imputer.fit(X[:,1:3])X[:,1:3]=imputer.transform(X[:,1:3])
第四步:編碼類數(shù)據(jù)。類數(shù)據(jù)是一個(gè)包含標(biāo)簽值的變量,通常它們被限制在一個(gè)固定的集合中。例如,‘Yes’ 或 ‘No’ 是無法用于模型中的數(shù)學(xué)表達(dá)式,因此我們需要對這些類數(shù)據(jù)進(jìn)行編碼,將其轉(zhuǎn)化為數(shù)值。我們可以通過 sklearn.preprocessing 中的 LabelEncoder 類方法來解決這個(gè)問題。
fromsklearn.preprocessingimportLabelEncoder,OneHotEncoderlabelencoder_X=LabelEncoder()X[:,0]=labelencoder_X.fit_transform(X[:,0])
第五步:將數(shù)據(jù)集分離為訓(xùn)練集和測試集。在機(jī)器學(xué)習(xí)中,我們通常需要對源數(shù)據(jù)集進(jìn)行處理,以便分離出訓(xùn)練集和測試集,分別用于模型的訓(xùn)練和測試。通常所使用的分離比為8:2,我們可以通過導(dǎo)入 sklearn.crossvalidation 庫的 train_test_split() 方法來解決這個(gè)問題。
fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=0)
第六步:特征縮放。大多數(shù)機(jī)器學(xué)習(xí)算法會采用歐式距離,來衡量兩個(gè)數(shù)據(jù)點(diǎn)特征變化情況。相比于低量級的特征,高量級的特征會在距離計(jì)算中占更大的權(quán)重??梢酝ㄟ^特征標(biāo)準(zhǔn)化或 Z 分?jǐn)?shù)正則化來解決,我們可以導(dǎo)入 sklearn.preprocessing 庫的 StandardScalar 方法。
fromsklearn.preprocessingimportStandardScalersc_X=StandardScaler()X_train=sc_X.fit_transform(X_train)X_test=sc_X.fit_transform(X_test)
Day 2
簡單的線性回歸
▌簡單的線性回歸模型
使用單個(gè)特征來預(yù)測結(jié)果。在這種回歸模型中,我們嘗試最小化預(yù)測值和真實(shí)值之間的損失,來得到最佳的擬合性能。
▌線性回歸的實(shí)現(xiàn)
第一步:數(shù)據(jù)預(yù)處理。回歸模型中的數(shù)據(jù)預(yù)處理過程遵循上述的數(shù)據(jù)處理流程,主要包括導(dǎo)入所需的庫,導(dǎo)入所需的數(shù)據(jù)集,檢查缺失數(shù)據(jù),分離數(shù)據(jù)集以及特征縮放。
importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltdataset=pd.read_csv('studentscores.csv')X=dataset.iloc[:,:1].valuesY=dataset.iloc[:,1].valuesfromsklearn.cross_validationimporttrain_test_splitX_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=1/4,random_state=0)
第二步:用訓(xùn)練數(shù)據(jù)擬合簡單的線性回歸模型。首先,我們導(dǎo)入 sklearn.linear_model 中的 LinearRegression 類。然后,我們?yōu)槟繕?biāo) regressor 創(chuàng)建一個(gè) LinearRegression 類?,F(xiàn)在,我們可以使用 LinearRegression 類的 fit() 方法來用訓(xùn)練數(shù)據(jù)去擬合我們的目標(biāo) regressor。
fromsklearn.linear_modelimportLinearRegressionregressor=LinearRegression()regressor=regressor.fit(X_train,Y_train)
第三步:預(yù)測結(jié)果。使用我們訓(xùn)練好的模型,在測試集上預(yù)測我們的結(jié)果。首先,我們?yōu)轭A(yù)測結(jié)果創(chuàng)建一個(gè)向量 Y-pred。然后,我們對訓(xùn)練好的 regressor 使用 LinearRegression 類的預(yù)測方法來進(jìn)行預(yù)測。
Y_pred=regressor.predict(X_test)
第四步:可視化。最后一步是可視化最后的結(jié)果,我們可以采用 matplotlib.pyplot 庫來為模型的訓(xùn)練結(jié)果和測試結(jié)果做出散點(diǎn)圖,可視化模型的預(yù)測結(jié)果。
plt.scatter(X_train,Y_train,color='red')plt.plot(X_train,regressor.predict(X_train),color='blue')
plt.scatter(X_test,Y_test,color='red')plt.plot(X_test,regressor.predict(X_test),color='blue')
Day 3
多元線性回歸
▌多元線性回歸模型
旨在通過擬合一個(gè)線性等式,探究兩個(gè)或多個(gè)特征變量之間的關(guān)系。多元線性回歸的處理步驟與簡單線性回歸的流程大致相似,不同就在于模型評估處理。由于多個(gè)變量對最終預(yù)測結(jié)果的影響是不同的,因此我們可以進(jìn)一步評估對模型影響最大的變量以及各變量之間的相互關(guān)系。一個(gè)好的多元線性回歸模型需要滿足以下幾個(gè)條件:
線性:不論是獨(dú)立還是非獨(dú)立的變量,它們之間的關(guān)系都應(yīng)該是線性的。
方差齊性 (Homoscedasticity):常量間誤差要始終存在。
多元正態(tài)性 (Multivariate Normality):多元回歸假設(shè)變量之間的殘差服從正態(tài)分布。
缺乏多重性 (Lack of Multicollinearity):這里假設(shè)數(shù)據(jù)間不存在多重性。只有當(dāng)特征或變量之間獨(dú)立時(shí)才存在多重性。
此外,多元回歸模型中使用的類數(shù)據(jù)是處理非數(shù)值數(shù)據(jù)類型非常有效的手段。類數(shù)據(jù)通常涉及一些表示類別數(shù)值的數(shù)據(jù),如性別(男/女)。在回歸模型中,這些數(shù)值通常可以被表示為啞變量,即用1或0代表類別數(shù)據(jù)出現(xiàn)或不出現(xiàn)。此外,對于兩個(gè)類數(shù)據(jù)之間存在相關(guān)性的問題,我們通常降低一個(gè)類別數(shù)量,以便正常使用回歸模型。
▌深入多元線性回歸
第一步:數(shù)據(jù)預(yù)處理
導(dǎo)入庫、導(dǎo)入數(shù)據(jù)集、編碼分類數(shù)據(jù)、分離數(shù)據(jù)為訓(xùn)練集和測試集
importpandasaspdimportnumpyasnpdataset=pd.read_csv('50_Startups.csv')X=dataset.iloc[:,:-1].valuesY=dataset.iloc[:,4].valuesfromsklearn.preprocessingimportLabelEncoder,OneHotEncoderlabelencoder=LabelEncoder()X[:,3]=labelencoder.fit_transform(X[:,3])onehotencoder=OneHotEncoder(categorical_features=[3])X=onehotencoder.fit_transform(X).toarray()X=X[:,1:]fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.2,random_state=0)
第二步:將多個(gè)線性回歸擬合到訓(xùn)練集
fromsklearn.linear_modelimportLinearRegressionregressor=LinearRegression()regressor.fit(X_train,Y_train)
第三步:預(yù)測測試集結(jié)果
y_pred=regressor.predict(X_test)
Day 4、5、6
Logistic 回歸與深入實(shí)踐
這部分將深入研究 Logistic 回歸模型,包括它背后的數(shù)學(xué)原理,如何計(jì)算成本函數(shù),以及如何將梯度下降算法應(yīng)用于成本函數(shù)以最小化預(yù)測誤差等內(nèi)容。
▌Logistic 回歸
Logistic 回歸通常用于不同類別的分類問題,旨在通過觀察現(xiàn)有目標(biāo)類預(yù)測所屬的類別。通常所給的是離散的二值數(shù)據(jù),介于0和1之間。Logistic 回歸最常見的例子是在選舉期間民眾的投票情況。
Logistic 回歸模型采用潛在的 logistic 函數(shù)得到估計(jì)概率值,來衡量獨(dú)立變量 (通常使我們要預(yù)測的標(biāo)簽值) 與一個(gè)或多個(gè)非獨(dú)立變量 (我們的特征值) 之間的關(guān)系。Logistic 函數(shù),也被稱為 sigmoid 函數(shù),這是一個(gè) S 型曲線函數(shù),它能夠?qū)⒐烙?jì)的概率值轉(zhuǎn)換為二進(jìn)制值0或1,以便模型預(yù)測得到結(jié)果。
與線性回歸模型得到連續(xù)型輸出不同,Logistic 回歸最終的結(jié)果是離散的。
▌深入 Logistic 回歸實(shí)戰(zhàn)
下面我以一個(gè)實(shí)例來具體說明整個(gè) Logistic 回歸的流程。
社交網(wǎng)絡(luò)數(shù)據(jù)集,這是一個(gè)包含社交網(wǎng)絡(luò)用戶信息的數(shù)據(jù)集,其中用戶信息包括用戶 ID,性別,年齡和估計(jì)工資等情況。一家汽車公司剛推出一款全新的豪華 SUV 騎車。我們的任務(wù)是試圖預(yù)測社交網(wǎng)絡(luò)中哪些用戶將有能力購買這款全新的 SUV。最后一列的數(shù)據(jù)代表用戶是否購買了這款 SUV (1代表購買,0代表不購買)。這里,我們打算構(gòu)建一個(gè) Logistic 回歸模型,并把年齡和估計(jì)工資兩列作為我們的特征矩陣。我們希望找到年齡和用戶估計(jì)工資,與用戶是否購買 SUV 決定之間的相關(guān)性。
第一步:數(shù)據(jù)預(yù)處理
導(dǎo)入所需的依賴庫
importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspd
導(dǎo)入所需的數(shù)據(jù)庫
dataset=pd.read_csv('Social_Network_Ads.csv')X=dataset.iloc[:,[2,3]].valuesy=dataset.iloc[:,4].values
數(shù)據(jù)庫地址:
https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/datasets/Social_Network_Ads.csv
第二步:將數(shù)據(jù)庫分離為訓(xùn)練庫和測試庫
fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
第三步:特征縮放
fromsklearn.preprocessingimportStandardScalersc=StandardScaler()X_train=sc.fit_transform(X_train)X_test=sc.transform(X_test)
第四步:Logistic 回歸模型
我們采用一個(gè)線性模型庫,因?yàn)?Logistic 回歸本身就是一個(gè)線性分類器,這意味著,我們將用一條直線在兩個(gè)維度把兩類用戶分開,然后導(dǎo)入 logistic 回歸類。 接下來,我們將從這個(gè)類中創(chuàng)建一個(gè)新對象,并作為我們的訓(xùn)練數(shù)據(jù)集中的分類器。
在訓(xùn)練集中擬合 logistic 回歸模型
fromsklearn.linear_modelimportLogisticRegressionclassifier=LogisticRegression()classifier.fit(X_train,y_train)
第五步:預(yù)測
用測試集數(shù)據(jù)預(yù)測結(jié)果
y_pred=classifier.predict(X_test)
第六步:評估預(yù)測結(jié)果
我們將通過可視化混淆矩陣評估 logistic 回歸模型的預(yù)測結(jié)果。混淆矩陣能夠顯示我們模型所做出的正確預(yù)測以及不正確的預(yù)測。
創(chuàng)建混淆矩陣
fromsklearn.metricsimportconfusion_matrixcm=confusion_matrix(y_test,y_pred)
第七步:可視化結(jié)果
Day 7、8、9
支持向量機(jī) SVM及算法實(shí)現(xiàn)
這部分學(xué)習(xí)將帶你直觀了解 SVM 是什么,以及如何使用它來解決分類問題。
▌SVM 算法的實(shí)現(xiàn)
支持向量機(jī) (SVM) 是一種監(jiān)督式的機(jī)器學(xué)習(xí)算法,可以用于回歸和分類任務(wù) (大多數(shù)情況)。它通過找尋一個(gè)分類超平面來分離兩個(gè)類別,換句話說,得到的最優(yōu)超平面能夠進(jìn)一步用于新樣本的分類。最優(yōu)超平面是能夠最大化類別數(shù)據(jù)之間間距的那個(gè)平面,換而言之,每個(gè)類別距離最優(yōu)超平面的點(diǎn)之間的距離是最大的。SVM 算法示意圖如下:
對于 SVM 算法而言,有四個(gè)至關(guān)重要的超參數(shù):
核大小 (Kernel):線性 SVM 中超平面是通過線性代數(shù)變換得到的,因此核大小扮演著關(guān)鍵的角色。多項(xiàng)式核和指數(shù)型核都能用于更高維度的線性分離計(jì)算。
正則化參數(shù) (Regularization):當(dāng)正則化參數(shù)過大時(shí),SVM 的優(yōu)化過程將選擇一個(gè)小邊距的超平面,相反一個(gè)非常小的正則化參數(shù)將導(dǎo)致優(yōu)化過程搜索一個(gè)大邊距的分離面。
GAMMA 參數(shù):小的 gamma 參數(shù)意味著遠(yuǎn)離可能超平面的點(diǎn)在計(jì)算分離線時(shí)會被考慮,相反大的 gamma 參數(shù)意味著靠近超平面的這些點(diǎn)在計(jì)算時(shí)會被考慮。
邊距 (Margin):邊距是分離線與最近類別數(shù)據(jù)點(diǎn)的距離。一個(gè)好的邊距能夠?qū)⑾鄳?yīng)類別的數(shù)據(jù)點(diǎn)分離開,而中間不會出現(xiàn)其他類別的數(shù)據(jù)。
▌SVM 算法的實(shí)現(xiàn)
下面以一個(gè)實(shí)例來具體說明
第一步:數(shù)據(jù)預(yù)處理
導(dǎo)入所需的庫
importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspd
導(dǎo)入所需的數(shù)據(jù)數(shù)據(jù)集
dataset=pd.read_csv('Social_Network_Ads.csv')X=dataset.iloc[:,[2,3]].valuesy=dataset.iloc[:,4].values
第二步:將數(shù)據(jù)庫分離為訓(xùn)練庫和測試庫
fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
第三步:特征縮放
fromsklearn.preprocessingimportStandardScalersc=StandardScaler()X_train=sc.fit_transform(X_train)X_test=sc.transform(X_test)
第四步:在訓(xùn)練集中擬合 SVM 算法
fromsklearn.svmimportSVCclassifier=SVC(kernel='linear',random_state=0)classifier.fit(X_train,y_train)
第五步:用測試集數(shù)據(jù)預(yù)測結(jié)果
y_pred=classifier.predict(X_test)
第六步:創(chuàng)建混淆矩陣
fromsklearn.metricsimportconfusion_matrixcm=confusion_matrix(y_test,y_pred)
第七步:可視化訓(xùn)練結(jié)果
frommatplotlib.colorsimportListedColormapX_set,y_set=X_train,y_trainX1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),alpha=0.75,cmap=ListedColormap(('red','green')))plt.xlim(X1.min(),X1.max())plt.ylim(X2.min(),X2.max())fori,jinenumerate(np.unique(y_set)):plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],c=ListedColormap(('red','green'))(i),label=j)plt.title('SVM(Trainingset)')plt.xlabel('Age')plt.ylabel('EstimatedSalary')plt.legend()plt.show()
第八步:可視化測試結(jié)果
frommatplotlib.colorsimportListedColormapX_set,y_set=X_test,y_testX1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),alpha=0.75,cmap=ListedColormap(('red','green')))plt.xlim(X1.min(),X1.max())plt.ylim(X2.min(),X2.max())fori,jinenumerate(np.unique(y_set)):plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],c=ListedColormap(('red','green'))(i),label=j)plt.title('SVM(Testset)')plt.xlabel('Age')plt.ylabel('EstimatedSalary')plt.legend()plt.show()
Day 10、11、12
K 最近鄰算法 (KNN)與算法實(shí)現(xiàn)
通過這部分學(xué)習(xí),你將學(xué)會如何實(shí)現(xiàn)一個(gè) KNN 算法。
▌KNN算法
K 最近鄰算法 (KNN) 是一種簡單的回歸分類模型,旨在通過非參數(shù)化的監(jiān)督式學(xué)習(xí)來訓(xùn)練樣本實(shí)例的算法。它不依賴于任何的數(shù)據(jù)分布假設(shè),也不需要通過學(xué)習(xí)模型來預(yù)測結(jié)果。在分類任務(wù)中,KNN 算法有三個(gè)關(guān)鍵要素:標(biāo)簽?zāi)繕?biāo)集合,目標(biāo)間的距離以及最近鄰 k 的個(gè)數(shù)。
對于無標(biāo)簽的目標(biāo),KNN 算法會先計(jì)算它與標(biāo)簽?zāi)繕?biāo)之間的距離,并確定其 k 個(gè)最近鄰數(shù)。然后,通過最近鄰目標(biāo)的類別標(biāo)簽來確定該目標(biāo)的類別。對于實(shí)值的輸入變量,最常用的距離度量是歐式距離。
歐式距離是通過計(jì)算兩個(gè)目標(biāo)各屬性值之間的平方和得到的。還有其他的距離度量包括:Hamming 距離,Manhattan 距離,Minkowski 距離等。
K 值得選?。喊l(fā)現(xiàn)最佳的 K 值不是件容易的事。K 值越少,則對結(jié)果的影響越大;而 K 值越大,則計(jì)算成本將越高。K 值得選取通常取決于你發(fā)樣本量,有時(shí)候你需要嘗試一些可能的 K 值來得到最佳的選擇。
▌KNN 算法的實(shí)現(xiàn)
下面以一個(gè)實(shí)例來具體說明
第一步:導(dǎo)入庫
importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspd
導(dǎo)入數(shù)據(jù)集
dataset=pd.read_csv('Social_Network_Ads.csv')X=dataset.iloc[:,[2,3]].valuesy=dataset.iloc[:,4].values
第二步:將數(shù)據(jù)集分離為訓(xùn)練集和測試集
fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
第三步:特征縮放
fromsklearn.preprocessingimportStandardScalersc=StandardScaler()X_train=sc.fit_transform(X_train)X_test=sc.transform(X_test)
第四步:在訓(xùn)練集中擬合 KNN 算法
fromsklearn.neighborsimportKNeighborsClassifierclassifier=KNeighborsClassifier(n_neighbors=5,metric='minkowski',p=2)classifier.fit(X_train,y_train)
第五步:預(yù)測測試集結(jié)果
y_pred=classifier.predict(X_test)
第六步:混淆矩陣
fromsklearn.metricsimportconfusion_matrixcm=confusion_matrix(y_test,y_pred)
Day 13、14、15
決策樹模型
▌決策樹模型
決策樹模型是一類用于類別和連續(xù)輸入輸出變量分類問題的監(jiān)督式學(xué)習(xí)算法。一個(gè)決策樹模型有許多分支,每個(gè)分支節(jié)點(diǎn)都代表一種選擇,每個(gè)葉子 (leaf) 節(jié)點(diǎn)都代表一種決策。下面我們來看看決策樹模型是如何工作的:
在下圖的高維空間,我們有很多個(gè)散布的數(shù)據(jù)點(diǎn),我們將采用決策樹模型將這些數(shù)據(jù)分離開。
首先我們將每種類別的數(shù)據(jù)分離開,并構(gòu)建一個(gè)決策樹模型,方便后續(xù)使用。
通過諸如 CART,ID3等決策樹算法,我們構(gòu)建的決策樹模型如下,這可以用于后續(xù)的輸出預(yù)測。
ID3 表示的是迭代的 Dichotomizer 3 算法,旨在給定樹節(jié)點(diǎn)的每個(gè)屬性數(shù)據(jù),通過自上而下的貪婪搜索來構(gòu)建一個(gè)決策樹模型。假定 A 是最佳屬性,則分配一個(gè)決策樹節(jié)點(diǎn)給 A。然后,對每個(gè) A 值,為其創(chuàng)建一個(gè)子節(jié)點(diǎn),直到遍歷所有的訓(xùn)練數(shù)據(jù)。如果創(chuàng)建的決策樹模型能夠完美地分類數(shù)據(jù),則終止上述過程,否則繼續(xù)迭代每個(gè)葉節(jié)點(diǎn)。
▌決策樹模型的實(shí)現(xiàn)
下面以一個(gè)實(shí)例來具體說明
第一步:導(dǎo)入庫
importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspd
導(dǎo)入數(shù)據(jù)集
dataset=pd.read_csv('Social_Network_Ads.csv')X=dataset.iloc[:,[2,3]].valuesy=dataset.iloc[:,4].values
第二步:將數(shù)據(jù)分離為訓(xùn)練集和測試集
fromsklearn.cross_validationimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
第三步:特征縮放
fromsklearn.preprocessingimportStandardScalersc=StandardScaler()X_train=sc.fit_transform(X_train)X_test=sc.transform(X_test)
第四步:將決策樹分類擬合到訓(xùn)練集
fromsklearn.treeimportDecisionTreeClassifierclassifier=DecisionTreeClassifier(criterion='entropy',random_state=0)classifier.fit(X_train,y_train)
第五步:預(yù)測測試集結(jié)果
y_pred=classifier.predict(X_test)
第六步:混淆矩陣
fromsklearn.metricsimportconfusion_matrixcm=confusion_matrix(y_test,y_pred)
第七步:可視化訓(xùn)練集結(jié)果
frommatplotlib.colorsimportListedColormapX_set,y_set=X_train,y_trainX1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),alpha=0.75,cmap=ListedColormap(('red','green')))plt.xlim(X1.min(),X1.max())plt.ylim(X2.min(),X2.max())fori,jinenumerate(np.unique(y_set)):plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],c=ListedColormap(('red','green'))(i),label=j)plt.title('DecisionTreeClassification(Trainingset)')plt.xlabel('Age')plt.ylabel('EstimatedSalary')plt.legend()plt.show()
第八步:可視化測試集結(jié)果
frommatplotlib.colorsimportListedColormapX_set,y_set=X_test,y_testX1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),alpha=0.75,cmap=ListedColormap(('red','green')))plt.xlim(X1.min(),X1.max())plt.ylim(X2.min(),X2.max())fori,jinenumerate(np.unique(y_set)):plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],c=ListedColormap(('red','green'))(i),label=j)plt.title('DecisionTreeClassification(Testset)')plt.xlabel('Age')plt.ylabel('EstimatedSalary')plt.legend()plt.show()
-
人工智能
+關(guān)注
關(guān)注
1789文章
46397瀏覽量
236584 -
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
562瀏覽量
28483 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8325瀏覽量
132194
原文標(biāo)題:逼瘋懶癌:“機(jī)器學(xué)習(xí)100天大作戰(zhàn)”正式開始!
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論