【机器学习--实战篇】⾜球运动员⾝价估计---XGBoost
-------------------------------------------------------------分割线-------------------------------------------------------
⾸先看下所有的特征介绍
特征解释类型
id⾏编号没有实际意义
club该球员所属的俱乐部该信息已经被编码
league该球员所在的联赛已被编码
birth_date⽣⽇格式为⽉/⽇/年
height_cm⾝⾼(厘⽶)数值变量
weight_kg体重(公⽄)数值变量
nationality国籍已被编码
potential球员的潜⼒数值变量
pac球员速度数值变量
sho射门(能⼒值)数值变量
pas传球(能⼒值)数值变量
美丽无比
dri带球(能⼒值)数值变量
def防守(能⼒值)数值变量
phy⾝体对抗(能⼒值)数值变量
international_reputation国际知名度数值变量
skill_moves技巧动作数值变量
weak_foot⾮惯⽤脚的能⼒值数值变量
work_rate_att球员进攻的倾向分类变量,Low,Medium,High work_rate_def球员防守的倾向分类变量,Low,Medium,High preferred_foot惯⽤脚1表⽰右脚、2表⽰左脚crossing传中(能⼒值)数值变量
鲁迅书法
finishing完成射门(能⼒值)数值变量
heading_accuracy头球精度(能⼒值)数值变量
short_passing短传(能⼒值)数值变量
volleys凌空球(能⼒值)数值变量
dribbling盘带(能⼒值)数值变量
curve弧线(能⼒值)数值变量
free_kick_accuracy定位球精度(能⼒值)数值变量
long_passing长传(能⼒值)数值变量
ball_control控球(能⼒值)数值变量
acceleration加速度(能⼒值)数值变量
祥的成语sprint_speed冲刺速度(能⼒值)数值变量
特征解释类型
agility灵活性(能⼒值)数值变量
reactions反应(能⼒值)数值变量
balance⾝体协调(能⼒值)数值变量
shot_power射门⼒量(能⼒值)数值变量
jumping弹跳(能⼒值)数值变量
stamina体能(能⼒值)数值变量
strength⼒量(能⼒值)数值变量
long_shots远射(能⼒值)数值变量
aggression侵略性(能⼒值)数值变量interceptions拦截(能⼒值)数值变量
positioning位置感(能⼒值)数值变量
vision视野(能⼒值)数值变量
penalties罚点球(能⼒值)数值变量
marking卡位(能⼒值)数值变量
standing_tackle断球(能⼒值)数值变量
sliding_tackle铲球(能⼒值)数值变量
gk_diving门将扑救(能⼒值)数值变量
gk_handling门将控球(能⼒值)数值变量
gk_kicking门将开球(能⼒值)数值变量
gk_positioning门将位置感(能⼒值)数值变量
gk_reflexes门将反应(能⼒值)数值变量
rw球员在右边锋位置的能⼒值数值变量
rb球员在右后卫位置的能⼒值数值变量
st球员在射⼿位置的能⼒值数值变量
lw球员在左边锋位置的能⼒值数值变量
cf球员在锋线位置的能⼒值数值变量质量月主题
cam球员在前腰位置的能⼒值数值变量
cm球员在中场位置的能⼒值数值变量
cdm球员在后腰位置的能⼒值数值变量
cb球员在中后卫的能⼒值数值变量
lb球员在左后卫置的能⼒值数值变量
gk球员在守门员的能⼒值数值变量
y该球员的市场价值(单位为万欧元)这是要被预测的数值1、预处理
函数功能
full_birthDate原表中的年份数据是2位,⽐如格式是这样的,09/10/89,因为计算年龄,所以补为完整的09/10/1989
函数功能
trans把csv中的⾮数值字符换为数值
judge csv中有⼀些数据是空的,需要去除空数据
def full_birthDate(x):
if(x[-2:]=='00'):
return x[:-2]+'20'+x[-2:]
el:
大暑养生return x[:-2]+'19'+x[-2:]
def trans(x):
if(x =='Medium'):
return1
elif(x =='High'):
return2
el:
return0
def judge(x):
if(x >0):
return1
el:
return0
2、读取数据,并新增初步的特征
增加的特征有:age、BMI、is_gk
这部分是看⽹站的标杆做的,⾃⼰本⾝没研究更多的特征⼯程
# 读取数据
def getData():
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
train['birth_date_']= train['birth_date'].apply(lambda x: full_birthDate(x))
test['birth_date_']= test['birth_date'].apply(lambda x: full_birthDate(x))
train['birth_date']= pd.to_datetime(train['birth_date_'])
train['age']=((w()- train['birth_date']).apply(lambda x: x.days)/365).apply(lambda t:int(t)) test['birth_date']= pd.to_datetime(test['birth_date_'],format='%m/%d/%Y', errors='coerce')
test['age']=((w()- test['birth_date']).apply(lambda x: x.days)/365).apply(lambda t:int(t))
train['work_rate_att_']= train['work_rate_att'].apply(lambda x: trans(x)).apply(lambda t:int(t))
train['work_rate_def_']= train['work_rate_def'].apply(lambda x: trans(x)).apply(lambda t:int(t))
test['work_rate_att_']= test['work_rate_att'].apply(lambda x: trans(x)).apply(lambda t:int(t))
test['work_rate_def_']= test['work_rate_def'].apply(lambda x: trans(x)).apply(lambda t:int(t))
服装名字
栽培品种train = train.drop('id',axis=1)
train = train.drop('birth_date',axis=1)
train = train.drop('birth_date_',axis=1)
train = train.drop('work_rate_att',axis=1)
train = train.drop('work_rate_def',axis=1)
枣夹核桃test = test.drop('id',axis=1)
test = test.drop('birth_date',axis=1)
test = test.drop('birth_date_',axis=1)
test = test.drop('work_rate_att',axis=1)
test = test.drop('work_rate_def',axis=1)
return train,test
3、数据分析
新增⼀个特征:best_pos(最佳位置)是通过对[‘rw’, ‘rb’, ‘st’, ‘lw’, ‘cf’, ‘cam’, ‘cm’, ‘cdm’, ‘cb’, ‘lb’,‘gk’]这11个特征的汇总。
特征解释类型
rw球员在右边锋位置的能⼒值数值变量
rb球员在右后卫位置的能⼒值数值变量
st球员在射⼿位置的能⼒值数值变量
lw球员在左边锋位置的能⼒值数值变量
cf球员在锋线位置的能⼒值数值变量
cam球员在前腰位置的能⼒值数值变量
cm球员在中场位置的能⼒值数值变量
cdm球员在后腰位置的能⼒值数值变量
cb球员在中后卫的能⼒值数值变量
lb球员在左后卫置的能⼒值数值变量
gk球员在守门员的能⼒值数值变量
盒图是⽤来观测离群点的,⽬前还没⽤到,等下⼀步⽤到在更新…
def data_ana(train, test):
# 获得球员最擅长位置上的评分
positions =['rw','rb','st','lw','cf','cam','cm','cdm','cb','lb','gk']
train['best_pos']= train[positions].max(axis=1)
test['best_pos']= test[positions].max(axis=1)
# 计算球员的⾝体质量指数(BMI)
train['BMI']=10000.* train['weight_kg']/(train['height_cm']**2)
test['BMI']=10000.* test['weight_kg']/(test['height_cm']**2)
# 判断⼀个球员是否是守门员
train['is_gk']= train['gk'].apply(lambda x: judge(x))
test['is_gk']= test['gk'].apply(lambda x: judge(x))
return train,test
def view_filter(train):
# 可视化盒图
# # 统计输出信息
percentile_result = np.percentile(train['y'],[25,50,75])
num =0
for i in list(train['y']):
if(i > percentile_result[2]*1.5):
num+=1
print(i)
# print('离群点个数:',num,'\n四分位数Q3:',percentile_result[2])
# print(num/len(list(train['y'])))
# 显⽰图例
plt.boxplot(x=train['y'],showmeans=True,meanline=True,whis=1.5)
plt.legend()
savefig('盒图.jpg')
# 显⽰图形
plt.show()
plt.clo()
4、训练
4.1 特征选择
注意n_estimators⼀定初始化⼤⼀点,因为会⾃动在收敛的地⽅⾃⼰停 选择特征,顺便确定n_estimators def xgboost_lect_feature(data_, labels_,cols,target):# # 特征选择
xgb1 = XGBRegressor(learning_rate =0.1,max_depth=5,min_child_weight=1,n_estimators=1000,
gamma=0,subsample=0.8,colsample_bytree=0.8,objective='reg:logistic',
nthread=4,scale_pos_weight=1,ed=27)
feature_ =list(modelfit(xgb1, data_.values,labels_.values,cols,target))# 特征选择
return feature_