数据准备
# 从原始数据中分离输入特征x和输出y
y = data['MEDV'].values
X = data.drop('MEDV', axis = 1)
当数据量比较大时,可用train_test_split从训练集中分出一部分做校验集; 样本数目较少时,建议用交叉验证 在线性回归中,留一交叉验证有简便计算方式,无需显式交叉验证。
#将数据分割训练数据与测试数据
from sklearn.cross_validation import train_test_split
# 随机采样25%的数据构建测试样本,其余作为训练样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)
数据预处理/特征工程
# 数据标准化
from sklearn.preprocessing import StandardScaler
# 分别初始化对特征和目标值的标准化器
ss_X = StandardScaler()
ss_y = StandardScaler()
# 分别对训练和测试数据的特征以及目标值进行标准化处理
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
#y_train = ss_y.fit_transform(y_train)
#y_test = ss_y.transform(y_test)
y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1, 1))
确定模型类型
# 尝试缺省参数的线性回归
#class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)
from sklearn.linear_model import LinearRegression
# 使用默认配置初始化
lr = LinearRegression()
# 训练模型参数
lr.fit(X_train, y_train)
# 预测,下面计算score会自动调用predict
lr_y_predict = lr.predict(X_test)
lr_y_predict_train = lr.predict(X_train)
#显示特征的回归系数
lr.coef_
out:
去除数值比较小的变量,有助于模型的准确。
模型评价
# 使用LinearRegression模型自带的评估模块(r2_score),并输出评估结果
#测试集
print 'The value of default measurement of LinearRegression on test is', lr.score(X_test, y_test)
#训练集
print 'The value of default measurement of LinearRegression on train is', lr.score(X_train, y_train)
#在训练集上观察预测残差的分布,看是否符合模型假设:噪声为0均值的高斯噪声
f, ax = plt.subplots(figsize=(7, 5))
f.tight_layout()
ax.hist(y_train - lr_y_predict_train,bins=40, label='Residuals Linear', color='b', alpha=.5);
ax.set_title("Histogram of Residuals")
ax.legend(loc='best');
#还可以观察预测值与真值的散点图
plt.figure(figsize=(4, 3))
plt.scatter(y_train, lr_y_predict_train)
plt.plot([-3, 3], [-3, 3], '--k')#数据已经标准化,3倍标准差即可
plt.axis('tight')
plt.xlabel('True price')
plt.ylabel('Predicted price')
plt.tight_layout()
# 线性模型,随机梯度下降优化模型参数
# 随机梯度下降一般在大数据集上应用,其实本项目不适合用
from sklearn.linear_model import SGDRegressor
# 使用默认配置初始化线
sgdr = SGDRegressor(max_iter=1000)
# 训练:参数估计
sgdr.fit(X_train, y_train)
# 预测
sgdr.coef_
# 使用SGDRegressor模型自带的评估模块,并输出评估结果
print 'The value of default measurement of SGDRegressor on test is', sgdr.score(X_test, y_test)
print 'The value of default measurement of SGDRegressor on train is', sgdr.score(X_train, y_train)
#这里由于样本数不多,SGDRegressor可能不如LinearRegression。 sklearn建议样本数超过10万采用SGDRegressor
正则化的线性回归:岭回归/L2正则
from sklearn.linear_model import RidgeCV
alphas = [0.01, 0.1, 1, 10,20, 40, 80,100]
reg = RidgeCV(alphas=alphas, store_cv_values=True)
reg.fit(X_train, y_train)
mse_mean = np.mean(reg.cv_values_, axis = 0)
plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1))
plt.plot(np.log10(reg.alpha_)*np.ones(3), [0.28, 0.29, 0.30])
plt.xlabel('log(alpha)')
plt.ylabel('mse')
plt.show()
print ('alpha is:', reg.alpha_)
reg.coef_
# 使用LinearRegression模型自带的评估模块(r2_score),并输出评估结果
print 'The value of default measurement of RidgeRegression is', reg.score(X_test, y_test)
正则化的线性回归 Lasso/L1正则
from sklearn.linear_model import LassoCV
alphas = [0.01, 0.1, 1, 10,100]
lasso = LassoCV(alphas=alphas)
lasso.fit(X_train, y_train)
mses = np.mean(lasso.mse_path_, axis = 1)
plt.plot(np.log10(lasso.alphas_), mses)
plt.xlabel('log(alpha)')
plt.ylabel('mse')
plt.show()
print ('alpha is:', lasso.alpha_)
lasso.coef_
# 使用LinearRegression模型自带的评估模块(r2_score),并输出评估结果
print 'The value of default measurement of Lasso Regression on test is', lasso.score(X_test, y_test)
print 'The value of default measurement of Lasso Regression on train is', lasso.score(X_train, y_train)
干货来咯:经过两天的摸索,整理出来的问题解决思路是:
一、判断问题类型,导入不同的工具包。
本例的工具包有:numpy、pandas、matplotlib.pyplot、seaborn。至于如何判断需要哪些工具包来解决问题,我想经过不断的学习,是应该会明白的。
二、读取数据,了解数据的基本信息,查看是否有空值并处理。
三、数据探索,了解各数据的统计特性。
1.单变量分布分析。
2.数据相关性,即考察每两个特征之间的相关性。
四、数据准备(可能需要丢弃部分数据)。
五、数据预处理、特征工程,数据标准化。
六、确定模型类型
1.尝试缺省参数的线性回归
1.1模型评价
自带评估模块
高斯分布
预测值与真值的散点图
2.正则化的线性回归(L2正则 --> 岭回归)
引入模型
输出图像、array
自带模型评估
3.正则化的线性回归(L1正则 --> Lasso)
引入模型
输出图像、array
自带模型评估
总结起来就是:固定格式,灵活调用,工具自取,随用随估。
领取专属 10元无门槛券
私享最新 技术干货