1.数据预处理
2.特征选择
3.XGBoost参数优化
4.误差测试
数据预处理
1.查看缺失值
'''
from xgboost import XGBRegressor
import pandas as pd
import numpy
import numpy as np
train = pd.read_csv("C://Users/65144/Desktop/train.csv")
test = pd.read_csv("C://Users/65144/Desktop/test.csv")
submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")
print(test[test.isnull().values==True])
print(train[train.isnull().values==True])#看是否有缺失值(没有)
'''
没有缺失值
2.查看统计指标(主要是方差和相关系数)
'''
corr=train.corr()#得到相关系数
np.set_printoptions(threshold=1e6) #设置阈值将省略的相关系数完整输出
print(corr)
t=numpy.corrcoef(train.temp_1,train.y)
s=numpy.corrcoef(train.is_workday,train.y)
d=numpy.corrcoef(train.weather,train.y)#还是不能完整输出。。只能单独输出
print(t,s,d)
'''
特征选择
Wrapper
递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:
'''
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression #递归特征消除法,返回特征选择后的数据
#参数estimator为基模型 #参数n_features_to_select为选择的特征个数
trian=RFE(estimator=LogisticRegression(), n_features_to_select=5).fit_transform(train, y)
'''
对xgboost进行参数优化
采用网格搜索GridSearchCV调参(网格搜索法是指定参数值的一种穷举搜索方法,通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法。)
目前对三个参数进行优化
max_depth:用于指定每个基础模型所包含的最大深度、默认为3层
n_estimators :用于指定基础模型的数量、默认为100个。
gamma:用于指定节点分割所需的最小损失函数下降值,即增益值Gain的阈值,默认为0.
''' from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
import pandas as pd
# 读取数据
train = pd.read_csv("C://Users/65144/Desktop/train.csv")
test = pd.read_csv("C://Users/65144/Desktop/test.csv")
submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")
# 删除id
train.drop(['id'] ,axis=1, inplace=True)
test.drop(['id'] ,axis=1, inplace=True)
# 取出训练集的y
y = train.pop('y')
param_test1 = {
'n_estimators':range(205,215,1)#由大范围大步跳向小范围小步跳调整,最后锁定范围在205到215之间
}
gsearch1 = GridSearchCV(estimator = XGBRegressor( learning_rate =0.1, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
nthread=4, scale_pos_weight=1, seed=27),
param_grid = param_test1#需要优化的对象, iid=False, cv=5)
gsearch1.fit(train, y)
print(gsearch1.best_params_, gsearch1.best_score_)#输出最佳参数值和模型得分
'''
结果为206
其他参数保持不变继续依次搜索
max_depth和 gamma
结果分别为7和0.4
测试 RMSE(比赛给出的误差测算方式 方差)
由于只有train有完整的属性值和标志值,所以将训练集二八分为训练集和测试机用以测试误差
'''
from xgboost import XGBRegressor
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取原本训练数据
train= pd.read_csv("C://Users/65144/Desktop/train.csv")
#删除ID,该属性没有实际意义
train.drop('id', axis=1, inplace=True)
#将属性y从样本集中移除并返回给y作为标记
y=train.pop('y')
#将原本的训练集随机划分,百分之80用于训练,百分之20用于测试
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)
# 建立一个默认的xgboost回归模型
#reg = XGBRegressor()
reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,
# nthread=4, scale_pos_weight=1)
#训练xgboost模型
reg.fit(x_train, y_train)
#对测试集进行预测
y_pred = reg.predict(x_test)
print(np.sqrt(sum((np.array(y_test) - np.array(y_pred))**2)/len(y_pred)))#输出RMSE
'''
再看一下未调参前的RMSE
'''
from xgboost import XGBRegressor
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取原本训练数据
train= pd.read_csv("C://Users/65144/Desktop/train.csv")
#删除ID,该属性没有实际意义
train.drop('id', axis=1, inplace=True)
#划分属性和标签
x=train
#将属性y从样本集中移除并返回给y作为标记
y=x.pop('y')
#将原本的训练集随机划分,百分之80用于训练,百分之20用于测试
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)
# 建立一个含初始参数的xgboost回归模型
reg = XGBRegressor()
#reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,
# nthread=4, scale_pos_weight=1)
#训练xgboost模型
reg.fit(x_train, y_train)
#对测试集进行预测
y_pred = reg.predict(x_test)
#RMSE
print(np.sqrt(sum((np.array(y_test) - np.array(y_pred))**2)/len(y_pred)))
'''
调参后误差小了1.17
把调参后的XGBoost方法和特征选择方法放到源代码中
考虑到真实自行车数量不会为负数,所以把测试出为负的预测值调整为0
'''
from xgboost import XGBRegressor
import pandas as pd
from sklearn.feature_selection import RFE
train = pd.read_csv("C://Users/65144/Desktop/train.csv")
test = pd.read_csv("C://Users/65144/Desktop/test.csv")
submit = pd.read_csv("C://Users/65144/Desktop/sample_submit.csv")
# 删除id
train.drop(['id'], axis=1, inplace=True)
test.drop(['id'], axis=1, inplace=True)
# 取出训练集的y
y_train = train.pop('y')
from sklearn.linear_model import LogisticRegression
#返回特征选择后的数据
trian=RFE(estimator=LogisticRegression(), n_features_to_select=5).fit_transform(train, y_train)
# 建立xgboost回归模型
reg = XGBRegressor(learning_rate = 0.1, n_estimators=206, max_depth=7, min_child_weight=7, seed=27, gamma=0.4,colsample_bytree=0.8,
nthread=4, scale_pos_weight=1)#刚刚的调参结果
reg.fit(train, y_train)
y_pred = reg.predict(test)
y_pred = list(map(lambda x: x if x >= 0 else 0, y_pred))#负数则取零
# 输出预测结果至my_XGB_prediction6.csv
submit['y'] = y_pred
submit.to_csv('C://Users/65144/Desktop/my_XGB_prediction7.csv', index=False)
'''
结果