请考虑正态分布数据集,如下所示:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import BaggingRegressor
from sklearn.metrics import mean_squared_error, r2_score, explained_variance_score
from scipy.stats import pearsonr
x_noise = np.random.uniform(low=-100,high=100,size=(10000,99))
x_main = np.random.normal(scale=0.3,size=(10000,1))
X = np.append(x_main,x_noise,axis=1)
Y = x_main + np.random.normal(scale=0.1,size=(10000,1))
此数据集将产生以下拟合结果:
bagging_model = BaggingRegressor(n_estimators=100,verbose=3,n_jobs=8)
bagging_model.fit(X, Y)
bagging_y_pred = bagging_model.predict(X)
print('mse = {}'.format(mean_squared_error(Y,bagging_y_pred)))
print('r2 = {}'.format(r2_score(Y,bagging_y_pred)))
print('r = {}'.format(pearsonr(Y.reshape(-1,),bagging_y_pred)))
mse = 0.0014806023178756198
,
r2 = 0.9850871571457275
,
r = (0.9928180380463698, 0.0)
现在,假设我们从上述数据集中删除了一些数据点,从而生成了一个较小但分布均匀的数据集:
x_noise = np.random.normal(size=(100,99))
x_main = np.random.uniform(low=-1,high=1,size=(100,1))
X2 = np.append(x_main,x_noise,axis=1)
Y2 = x_main + np.random.normal(scale=0.1)
拟合后,我们得到:
bagging_model2 = BaggingRegressor(n_estimators=100,verbose=3,n_jobs=8)
bagging_model2.fit(X2, Y2)
bagging_y_pred2 = bagging_model2.predict(X2)
print('mse = {}'.format(mean_squared_error(Y2,bagging_y_pred2)))
print('r2 = {}'.format(r2_score(Y2,bagging_y_pred2)))
print('r = {}'.format(pearsonr(Y2.reshape(-1,),bagging_y_pred2)))
mse = 0.00019738077056845335
,
r2 = 0.9994565173066261
,
r = (0.999738196598864, 1.3608287552065303e-162)
这似乎比第一个模型要好一点,因为所有mse
,r2
和r
指标都比以前的模型好很多。
那么,我可以得出一个结论:统一的分布式数据集比正态分布的数据集更好吗?由于统一的分布式数据集在数据点较少的情况下表现更好。
p.s。尽管在此实验中我仅使用BaggingRegressor
,但其他模型,例如SVM
和GradientBoostingRegressor
在较小但均匀分布的数据集上也表现出更好的性能。