整体思路
- 导入数据后,将训练集和测试集粘合
- 特征搜索,通过观察每个特征下训练集和测试集的数据的取值范围以及分布情况,将分布不均匀的特征项删除
- 特征相关性处理:将每一个特征与训练集的目标值计算相关性,删除相关性低且分布不均匀的特征,note:可以通过生成heatmap的方式观察每个特征与目标值之间的相关性或相关系数
- 数据处理:对数据进行归一化,并使用boxcox方法使每一个特征下的数据集更加正态分布化
- 使用ridge回归算法训练测试集,将异常点(噪声)删除,提高测试准确度
- 算法模型的建立:通过字典建立尽可能多地预测模型观测训练集在每一个模型下的r2和mse从而减少那些对于该数据集预测不准确的模型,保留那些r2较大,mse较小的值。
- 用保留下的算法模型fit训练集对测试集的特征数据集进行预测,将每一组预测值添加到列表中,并去列表下所有预测值的平均数。
- 储存预测值
其他可能减小MSE的方法
- 将每个算法预测出的值作为新特征加入到原始数据集和测试集中。
- 将预测值通过数学计算变得更加拟合正态分布。
- 对预测模型的超参数进行调参。
代码1:使用标准化进行预测
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression,Lasso,Ridge,RidgeCV,ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import GradientBoostingRegressor,RandomForestRegressor,AdaBoostRegressor,ExtraTreesRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler,StandardScaler,PolynomialFeatures,minmax_scale
import warnings
from scipy import stats
warnings.filterwarnings("ignore")
#数据聚合
train=pd.read_csv("zhengqi_train.txt",sep="\t")
test=pd.read_csv("zhengqi_test.txt",sep="\t")
train["origin"]="train"
test["origin"]="test"
data_all=pd.concat([train,test])
#print(data_all.shape) #(4813, 40)
#print(data_all.head())
'''特征探索'''
#38个特征,将一些不重要的特征删除
#特征分布情况,训练和测试数据特征分布不均匀,删除
'''
plt.figure(figsize=(9,6))
for i,col in enumerate(data_all.columns[:-2]):
#密度图
cond_train=data_all["origin"]=="train" #检索属于训练集的
train_col=data_all[col][cond_train] #取出训练集的每一列
cond_test = data_all["origin"] == "test"
test_col = data_all[col][cond_test]
# axes=plt.subplot(38,1,i+1)
ax=sns.kdeplot(train_col,shade=True)
sns.kdeplot(test_col,shade=True,ax=ax)
plt.legend(["train","test"])
plt.xlabel(col)
plt.show()
plt.figure(figsize=(9,6))
for col in data_all.columns[:-2]:
g=sns.FacetGrid(data_all,col="origin")
g.map(sns.distplot,col) #distribute
# plt.show()
'''
drop_labels=["V11","V17","V22","V5"]
data_all=data_all.copy()
data_all.drop(drop_labels,axis=1,inplace=True)
print(data_all.shape)
'''相关性系数'''
#方差是协方差的一种特殊形式
cov=data_all.cov() #协方差
corr=data_all.corr()#相关系数
#查看特征和目标值的相关系数
cond=corr.loc["target"].abs()<0.1 #把特征与目标之间相关系数小于0.1的删除
# print(corr.loc["target"].index[cond])
#Index(['V14', 'V21', 'V25', 'V26', 'V32', 'V33', 'V34']
'''通过与密度图做对比,删除v14,v21特征'''
drop_labels_1=["V14","V21"]
data_all.drop(drop_labels_1,axis=1,inplace=True)
print(data_all.shape)
'''热图'''
# plt.figure(figsize=(20,16))
# mcorr=train.corr()
# mask=np.zeros_like(mcorr,dtype=np.bool)
# mask[np.triu_indices_from(mask)]&#