''' 集合算法: 1.正向激勵 2.自助聚合:每次從總樣本矩陣中以有放回抽樣的方式隨機抽取部分樣本構建決策樹,這樣形成多棵包含不同訓練樣本的決策樹, 以削弱某些強勢樣本對模型預測結果的影響,提高模型的泛化特性。 3.隨機森林:在自助聚合的基礎上,每次構建決策樹模型時,不僅隨機選擇部分樣本,而且還隨機選擇部分特征,這樣的集合算法, 不僅規避了強勢樣本對預測結果的影響,而且也削弱了強勢特征的影響,使模型的預測能力更加泛化。(中庸-->真值) 隨機森林相關API: import sklearn.ensemble as se # 隨機森林回歸模型 (屬於集合算法的一種) # max_depth:決策樹最大深度10 # n_estimators:構建1000棵決策樹,訓練模型 # min_samples_split: 子表中最小樣本數 若小於這個數字,則不再繼續向下拆分 model = se.RandomForestRegressor(max_depth=10, n_estimators=1000, min_samples_split=2) 案例:分析共享單車的需求,從而判斷如何進行共享單車的投放。 1.讀取數據 bike_day.csv 2.整理輸入集和輸出集 划分測試集與訓練集 3.選擇模型----隨機森林,訓練模型 4.使用測試集輸出r2得分 5.輸出特征重要性,並繪制圖像 ''' import numpy as np import matplotlib.pyplot as mp import sklearn.metrics as sm import sklearn.ensemble as se # 集合算法模塊 import sklearn.utils as su # 打亂數據 '''=================================分析bike_day.csv===============================''' # 讀取數據方法1 # data = [] # with open('./ml_data/bike_day.csv','r') as f: # for line in f.readlines(): # data.append(line[:-1].split(',')) # print(data) # data = np.array(data) # 讀取數據方法2 data = np.loadtxt('./ml_data/bike_day.csv', unpack=False, dtype='U20', delimiter=',') print(data.shape) day_headers = data[0, 2:13] print(day_headers) x = np.array(data[1:, 2:13], dtype='f8') y = np.array(data[1:, -1], dtype='f8') # 划分測試集和訓練集 x, y = su.shuffle(x, y, random_state=7) # 打亂樣本 train_size = int(len(x) * 0.9) train_x, test_x, train_y, test_y = x[:train_size], x[train_size:], y[:train_size], y[train_size:] # 訓練模型 model = se.RandomForestRegressor(max_depth=10, n_estimators=1000, min_samples_split=3) model.fit(train_x, train_y) # 模型測試 pred_test_y = model.predict(test_x) # 模型評估 print('bike_day的r2_score得分:', sm.r2_score(test_y, pred_test_y)) # 輸出模型特征重要性 day_fi = model.feature_importances_ '''=================================分析bike_hour.csv===============================''' # 讀取數據 data = [] with open('./ml_data/bike_hour.csv', 'r') as f: for line in f.readlines(): data.append(line[:-1].split(',')) data = np.array(data) hour_headers = data[0, 2:14] print(hour_headers) x = np.array(data[1:, 2:14], dtype='f8') y = np.array(data[1:, -1], dtype='f8') # 划分測試集和訓練集 x, y = su.shuffle(x, y, random_state=7) # 打亂樣本 train_size = int(len(x) * 0.9) train_x, test_x, train_y, test_y = x[:train_size], x[train_size:], y[:train_size], y[train_size:] # 訓練模型 model = se.RandomForestRegressor(max_depth=10, n_estimators=1000, min_samples_split=3) model.fit(train_x, train_y) # 模型測試 pred_test_y = model.predict(test_x) # 模型評估 print('bike_hour的r2_score得分:', sm.r2_score(test_y, pred_test_y)) # 輸出模型特征重要性 hour_fi = model.feature_importances_ # 畫出bike_day的特征重要性圖像 mp.figure('Feature Importance', facecolor='lightgray') mp.rcParams['font.sans-serif'] = 'SimHei' mp.subplot(211) mp.title('Bike_day FI') mp.ylabel('Feature Importance') mp.grid(linestyle=":") sorted_indexes = day_fi.argsort()[::-1] # 下標排序,從大到小 x = np.arange(day_headers.size) mp.bar(x, day_fi[sorted_indexes], 0.7, color='dodgerblue', label='BDFI') mp.xticks(x, day_headers[sorted_indexes]) # 設置x軸坐標 mp.tight_layout() mp.legend() # 畫出bike_hour的特征重要性圖像 mp.subplot(212) mp.title('Bike_hour FI') mp.ylabel('Feature Importance') mp.grid(linestyle=":") sorted_indexes = hour_fi.argsort()[::-1] # 下標排序,從大到小 x = np.arange(hour_headers.size) mp.bar(x, hour_fi[sorted_indexes], 0.7, color='orangered', label='BHFI') mp.xticks(x, hour_headers[sorted_indexes]) # 設置x軸坐標 mp.tight_layout() mp.legend() mp.show() 輸出結果: (732, 16) ['season' 'yr' 'mnth' 'holiday' 'weekday' 'workingday' 'weathersit' 'temp' 'atemp' 'hum' 'windspeed'] bike_day的r2_score得分: 0.8929064136199945 ['season' 'yr' 'mnth' 'hr' 'holiday' 'weekday' 'workingday' 'weathersit' 'temp' 'atemp' 'hum' 'windspeed'] bike_hour的r2_score得分: 0.9185230199218621