背景介绍
每个足球运动员在转会市场都有各自的价码。本次数据练习的目的是根据球员的各项信息和能力值来预测该球员的市场价值。
数据来源
下载源(数据经过脱敏加工)以及变量说明
- train.csv 训练集,文件大小 2.20mb
- test.csv 预测集, 文件大小 1.44kb
- sample_submit.csv 提交示例 文件大小 62kb
评价方法
评价标准为MAE(Mean Absolute Error)。
比如若真实值为y=(y1,y2,⋯,yn),模型的预测值为y=(y1,y2,⋯,yn),那么该模型的MAE计算公式为
MAE=(∑ni=1|yi−y^i|)/n.
例如,真实值y=(15,20,12),预测值y^=(17,24,9),那么这个预测结果的MAE为
MAE=(|15−17|+|20−24|+|12−9|)/3=3
MAE越小,说明模型预测得越准确。
门将和非门将随机森林
import numpy as np
import pandas as pd
from datetime import date
from pandas import Series,DataFrame
from sklearn.ensemble import RandomForestRegressor
#读取数据
train=pd.read_csv('data/train.csv')
print(train.head())
test=pd.read_csv('data/test.csv')
sample_submit=pd.read_csv('data/sample_submit.csv')
#获得球员年龄
today=date(2019,4,24)
# print(today.year)
# print(train.columns)
#转换时间格式 10/4/96--》1996-10-04
train['birth_date']=pd.to_datetime(train['birth_date'])
train['age'] = (today.year- train['birth_date'].apply(lambda x: x.year))
# print(train['age'].head())
test['birth_date']=pd.to_datetime(test['birth_date'])
test['age'] = (today.year- test['birth_date'].apply(lambda x: x.year))
# print(test['age'].head())
#获得球员最擅长位置的评分
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)
print(train[positions].head())
print(train["best_pos"].head())
#计算球员的身体脂量指数(BMI)
train['BMI']=10000*train['weight_kg']/(train['height_cm']**2)
test['BMI']=10000*test['weight_kg']/(test['height_cm']**2)
print(train['BMI'].head())
#判断一个球员是不是守门员
train['is_gk']=train['gk']>0
test['is_gk']=train['gk']>0
print(train['is_gk'].head())
#用多个变量准备随机森林训练
test['pred']=0
cols = ['height_cm', 'weight_kg','age', 'best_pos','potential', 'BMI', 'pac',
'phy', 'international_reputation']
#用非守门员数据训练随机森林
reg_ngk = RandomForestRegressor(random_state=100)
reg_ngk.fit(train[train['is_gk'] == False][cols], train[train['is_gk'] == False]['y'])
preds = reg_ngk.predict(test[test['is_gk'] == False][cols])
test.loc[test['is_gk'] == False, 'pred'] = preds
print(preds)
#用守门员数据训练随机森林
reg_gk = RandomForestRegressor(random_state=100)
reg_gk.fit(train[train['is_gk'] == True][cols], train[train['is_gk'] == True]['y'])
preds = reg_gk.predict(test[test['is_gk'] == True][cols])
test.loc[test['is_gk'] == True,'pred'] = preds# .loc先行后列 对数据进行切割
#输出预测值
sample_submit['y']=np.array(test['pred'])
sample_submit.to_csv('data/my_RF_prediction.csv',index=False)