在机器学习中使用统一分布数据集比使用正态分布数据集更好吗?

时间:2018-06-30 13:39:20

标签: python-3.x numpy machine-learning normal-distribution

请考虑正态分布数据集,如下所示:

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))

enter image description here

此数据集将产生以下拟合结果:

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.0014806023178756198r2 = 0.9850871571457275r = (0.9928180380463698, 0.0)

enter image description here


现在,假设我们从上述数据集中删除了一些数据点,从而生成了一个较小但分布均匀的数据集:

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)

enter image description here

拟合后,我们得到:

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.00019738077056845335r2 = 0.9994565173066261r = (0.999738196598864, 1.3608287552065303e-162)

enter image description here

这似乎比第一个模型要好一点,因为所有mser2r指标都比以前的模型好很多。

那么,我可以得出一个结论:统一的分布式数据集比正态分布的数据集更好吗?由于统一的分布式数据集在数据点较少的情况下表现更好。

p.s。尽管在此实验中我仅使用BaggingRegressor,但其他模型,例如SVMGradientBoostingRegressor在较小但均匀分布的数据集上也表现出更好的性能。

0 个答案:

没有答案