前言
決策樹是一種監(jiān)督機器學(xué)習(xí)算法,用于回歸和分類任務(wù)。樹是可以處理復(fù)雜數(shù)據(jù)集的強大算法。
決策樹特性:
- 不需要數(shù)值輸入數(shù)據(jù)進行縮放。無論數(shù)值是多少,決策樹都不在乎。
- 不同于其他復(fù)雜的學(xué)習(xí)算法,決策樹的結(jié)果是可以解釋的,決策樹不是黑盒類型的模型。
- 雖然大多數(shù)模型都有缺失值的問題,但決策樹卻沒有問題。
- 樹可以處理不平衡的數(shù)據(jù)集,只需要調(diào)整類的權(quán)重。
- 樹可以提供特征的重要性或每個特征對模型訓(xùn)練結(jié)果的貢獻。
- 樹是隨機森林和梯度增強機等集成方法的基本構(gòu)建塊。
決策樹的工作方式就像一系列if/else問題。假設(shè)你想決定買哪輛車。為了買到合適的車,你可以通過問一系列類似的問題來評估安全水平,座位和門的數(shù)量。
決策樹的一個眾所周知的缺點是傾向于容易過擬合數(shù)據(jù)(基本上假設(shè)它們一開始總是過擬合)??朔^擬合的一種方法是減少決策樹中的最大深度(稱為“max_depth”超參數(shù))。
1.導(dǎo)入模塊
import numpy as np
import pandas as pd
import seaborn as sns
import sklearn
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
2.加載數(shù)據(jù)
在這個使用決策樹的回歸任務(wù)中,將使用機器CPU(中央處理單元)數(shù)據(jù),該數(shù)據(jù)可在OpenML上獲得。這里將使用Sklearn ’ fetch_openml '函數(shù)加載它。
該數(shù)據(jù)集將根據(jù)以下數(shù)據(jù)預(yù)測CPU的相對性能:
- MYCT:以納秒為單位的機器周期時間(整數(shù))
- MMIN:最小主存(千字節(jié))(整數(shù))
- MMAX:最大主存,單位為千字節(jié)(整數(shù))
- cache:以千字節(jié)為單位的cache(整數(shù))
- CHMIN:最小通道數(shù)單位(整數(shù))
- CHMAX:最大通道數(shù)單位(整數(shù))
- PRP:公布的相對性能(整數(shù))(目標(biāo)變量)
from sklearn.datasets import fetch_openml
machine_cpu = fetch_openml(name='machine_cpu')
machine_data = machine_cpu.data
machine_labels = machine_cpu.target
3.探索性分析數(shù)據(jù)
在進行探索性分析之前,讓我們先獲取訓(xùn)練和測試數(shù)據(jù)。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(machine_data,machine_labels, test_size=0.2,random_state=20)
可視化所有數(shù)字特征的直方圖。
X_train.hist(bins=50, figsize=(15,10))
plt.show()
或者可以快速使用’ sn.pairplot() '查看數(shù)據(jù)。
sns.pairplot(X_train)
4.數(shù)據(jù)預(yù)處理
將數(shù)據(jù)準(zhǔn)備為機器學(xué)習(xí)模型提供適當(dāng)?shù)母袷健?br> 決策樹并不關(guān)心特征是否縮放??山⒁粋€Pipeline來縮放特征。
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
scale_pipe = Pipeline([('scaler', StandardScaler())])
X_train_scaled = scale_pipe.fit_transform(X_train)
5.訓(xùn)練決策樹回歸器
from sklearn.tree import DecisionTreeRegressor
#原始數(shù)據(jù)上訓(xùn)練
tree_reg = DecisionTreeRegressor()
tree_reg.fit(X_train, y_train)
#在縮放后的數(shù)據(jù)上訓(xùn)練相同的模型。
tree_reg_scaled = DecisionTreeRegressor()
tree_reg_scaled.fit(X_train_scaled, y_train)
6.評估決策樹
先檢查訓(xùn)練的均方根誤差。不建議根據(jù)測試數(shù)據(jù)對模型進行評估,因為還沒有對模型進行改進。這里會寫一個函數(shù),讓它更簡單,避免重復(fù)。
from sklearn.metrics import mean_squared_error
def predict(input_data,model,labels):
preds = model.predict(input_data)
mse = mean_squared_error(labels,preds)
rmse = np.sqrt(mse)
return rmse
predict(X_train, tree_reg, y_train) #9.724590719956222
predict(X_train_scaled, tree_reg_scaled, y_train) #9.724590719956222
正如你所看到的,兩者根本沒有區(qū)別。所以在未來使用決策樹的項目中,無論是否縮放數(shù)據(jù),預(yù)測結(jié)果都不會受到影響。
7.改進決策樹
改進決策樹模型的一種方法是找到max_depth和其他一些參數(shù)的正確數(shù)量。使用GridSearch來查找最佳超參數(shù)。注意,因為數(shù)據(jù)集比較小,這樣做可能會導(dǎo)致過擬合。但這樣做是為了學(xué)習(xí)(你可以把它應(yīng)用到實際的問題中)。
from sklearn.model_selection import GridSearchCV
params_grid = {'max_leaf_nodes': list(range(0, 10)), 'min_samples_split': [0,1,2, 3, 4],
'max_depth':[None,0,1,2,3]}
#默認(rèn)情況下,Refit為true。最好的estimator(估計器)是在整個數(shù)據(jù)集上訓(xùn)練的
grid_search = GridSearchCV(DecisionTreeRegressor(random_state=42), params_grid, verbose=1, cv=3, refit=True)
grid_search.fit(X_train, y_train)
tree_best = grid_search.best_estimator_
predict(X_train, tree_best, y_train) #34.999530266023044
可以看到,結(jié)果overfitted。
最后可以在測試集上對模型進行評估,用原來的模型。文章來源:http://www.zghlxwxcb.cn/news/detail-830389.html
predict(X_test, tree_reg, y_test) #42.89411103991738
8.總結(jié)
這里學(xué)習(xí)了決策樹背后的基本思想,并使用它來預(yù)測CPU性能。在下一個實驗中,將使用決策樹來完成分類任務(wù),將使用一個真實的數(shù)據(jù)集,這樣就可以實際地改進決策樹模型。文章來源地址http://www.zghlxwxcb.cn/news/detail-830389.html
到了這里,關(guān)于機器學(xué)習(xí)-決策樹-回歸-CPU(中央處理單元)數(shù)據(jù)-python scikit-learn的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!