数据集来自Kaggle:House Prices - Advanced Regression Techniques | Kaggle
首先对数据集进行处理:
将去掉标签的数据集和测试集合并一起处理,在处理完成后再划分回各自集合。
标签列在处理前整体呈大概泊松分布,需要进行处理。
其中np.log1p是对标签列进行对数变化,使整体数据呈正态分布。
train_data=pd.read_csv('train.csv')
test_data=pd.read_csv('test.csv')
#dataset=dataset.drop('SalePrice',axis='columns')
#查看标签数据整体分布情况
'''
sns.displot(dataset['SalePrice'])
plt.show()
'''
#pop之后原数据已经去除了标签列,并对标签列进行了对数转换
y_train = np.log1p(train_data.pop("SalePrice"))
#print(y_train)
#将测试集与数据集的其他数据进行合并同步处理
dataset=pd.concat((train_data, test_data), axis=0)
dataset=dataset.drop('Id',axis='columns')
#print(dataset)
dataset["MSSubClass"] = dataset["MSSubClass"].astype(str)
#对缺失值进行平均值填补
all_dummy_data = pd.get_dummies(dataset)
mean_cols = all_dummy_data.mean()
all_dummy_data = all_dummy_data.fillna(mean_cols)
#print(all_dummy_data.isnull().sum().sum())
#提取数值类型的列
numeric_cols = dataset.columns[dataset.dtypes != "object"]
numeric_col_means = all_dummy_data.loc[:, numeric_cols].mean()
numeric_col_std = all_dummy_data.loc[:, numeric_cols].std()
all_dummy_data.loc[:, numeric_cols] = (all_dummy_data.loc[:, numeric_cols] - numeric_col_means)/numeric_col_std
X_train = all_dummy_data.iloc[0:1460].values
X_test=all_dummy_data.iloc[1460:2919].values
数据转换效果查看:
可以使用以下代码查看对数转换后数据效果,并与标准正态分布进行对比。
#设置符号显示
plt.rcParams['axes.unicode_minus']=False
#绘制转换后的直方图, fit=norm可以绘制正态分布曲线作为对比
sns.distplot(dataset['SalePrice'], fit=norm)
#拟合SalePrice的正态分布参数
(mu, sigma) = norm.fit(dataset['SalePrice'])
#查看正态分布参数
print('\n mu={:.2f} and sigma={:.2f} \n'.format(mu, sigma))
plt.legend(['Normal dist.($\mu=$ {:.2f} and $\sigma=$ {:.2f})'.format(mu, sigma)], loc='best')
plt.ylabel('Frequency')
plt.title('Distribution')
#创建新图像,不然两个图会画到一起
fig = plt.figure()
#绘制Q-Q图,只要Q-Q图呈一条直线表示数据呈正态分布
stats.probplot(dataset['SalePrice'], plot=plt)
plt.show()
经过对数处理后可以看出整体数据呈正态分布,Q-Q图结果也表明数据呈正态分布。
回归分析模型使用sklearn中的岭回归模型,首先进行模型中α参数的选取:
alphas = np.logspace(-3, 2, 50)
test_scores = []
for alpha in alphas:
clf = Ridge(alpha)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10,scoring="neg_mean_squared_error"))
test_scores.append(np.mean(test_score))
plt.plot(alphas, test_scores)
plt.xlabel("alphas")
plt.ylabel("test scores")
plt.show()
可以看出在α约为15的时候效果最好。
对训练集数据进行拟合并保存结果,查看拟合数据MAE。
ridge = Ridge(alpha=15)
ridge.fit(X_train, y_train)
y_ridge = np.expm1(ridge.predict(X_train))
submission_data = pd.DataFrame(data={"Id": test_data.index, "SalePrice": y_ridge})
submission_data.to_csv("submission_0.csv", index=False)
print(mean_absolute_error(np.expm1(y_train),y_ridge))
MAE结果为:13649.486520362263
对数据进行归一化处理可以使得训练效果更好。
参考网址:
https://zhuanlan.zhihu.com/p/130364126
机器学习实战:kaggle房价回归预测实战 | 记忆碎片