一、比賽說明
比賽位址:https://www.kaggle.com/c/bi-attrition-predict
問題描述
資料包括員工的各種統計資訊,以及該員工是否已經離職,統計的資訊包括工資、出差、工作環境滿意度、工作投入度、是否加班、是否升職、工資提升比例等。
需要通過訓練資料得出員工離職預測的結果。
評分标準
AUC
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGL0EzXlpXazxCc5JXNUtUc18UavVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2QDOyUzNidjM5UzMyImZ5kzNyQjNhVjZiNGZjFjZwY2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、代碼
import pandas as pd
train = pd.read_csv('train.csv',index_col=0)
test = pd.read_csv('test.csv',index_col=0)
#print(train['Attrition'].value_counts())
# 處理Attrition字段
train['Attrition'] = train['Attrition'].map(lambda x: 1 if x == 'Yes' else 0)
from sklearn.preprocessing import LabelEncoder
# 檢視資料是否有空值
#print(train.isna().sum())
# 去掉沒用的列 員工号碼,标準工時(=80)
train = train.drop(['EmployeeNumber', 'StandardHours'], axis = 1)
test = test.drop(['EmployeeNumber', 'StandardHours'], axis = 1)
# 對于分類特征進行特征值編碼
attr = ['Age','BusinessTravel','Department','Education','EducationField','Gender','JobRole','MaritalStatus','Over18','OverTime']
lbe_list = []
for feature in attr:
lbe=LabelEncoder()
train[feature] = lbe.fit_transform(train[feature])
test[feature] = lbe.transform(test[feature])
lbe_list.append(lbe)
#train.to_csv('temp.csv')
#print(train)
import xgboost as xgb
from sklearn.model_selection import train_test_split
param = {'boosting_type':'gbdt',
'objective' : 'binary:logistic', #
'eval_metric' : 'auc',
'eta' : 0.01,
'max_depth' : 15,
'colsample_bytree':0.8,
'subsample': 0.9,
'subsample_freq': 8,
'alpha': 0.6,
'lambda': 0,
}
X_train, X_valid, y_train, y_valid = train_test_split(train.drop('Attrition',axis=1), train['Attrition'], test_size=0.2, random_state=42)
train_data = xgb.DMatrix(X_train, label=y_train)
valid_data = xgb.DMatrix(X_valid, label=y_valid)
test_data = xgb.DMatrix(test)
model = xgb.train(param, train_data, evals=[(train_data, 'train'), (valid_data, 'valid')], num_boost_round = 10000, early_stopping_rounds=200, verbose_eval=25)
predict = model.predict(test_data)
test['Attrition'] = predict
print(predict)
# 轉化為二分類輸出
#test['Attrition']=test['Attrition'].map(lambda x:1 if x>=0.5 else 0)
test[['Attrition']].to_csv('submit_xgb.csv')
三、分數
0.83709