預測分析 · 員工滿意度預測

競賽地址

1. 導入工具包

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.facecolor']=(1,1,1,1) # pycharm 繪圖白底,看得清座標
import pandas as pd
import seaborn as sns
from sklearn import preprocessing
from sklearn.linear_model import LinearRegression as lr
from sklearn.ensemble import RandomForestRegressor as rf
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.metrics import *
from sklearn.preprocessing import OneHotEncoder,LabelEncoder,OrdinalEncoder

2. 讀取數據

在這裏插入圖片描述

# 讀取數據
tr_data = pd.read_csv("train.csv",index_col='id')
X_test = pd.read_csv("test.csv",index_col='id') # test不含標籤

tr_data.head(10)
tr_data.corr() # 相關係數
sns.regplot(x=tr_data.index, y=tr_data['satisfaction_level'])

在這裏插入圖片描述
可以看出 上一次的評分、有沒有工傷、過去5年有沒有晉升 跟 滿意度 呈正相關係數
在這裏插入圖片描述
可以看出 id 跟滿意度,沒有特別強的關係,可以不作爲特徵

3. 特徵處理

# X丟棄標籤
X = tr_data.drop(['satisfaction_level'], axis=1) 
y = tr_data['satisfaction_level']

# 切分數據
X_train, X_valid, y_train, y_valid = train_test_split(X, y,test_size=0.2,random_state=1)

# 特徵列名
feature = X_train.columns
print(feature)

# 查看文字特徵列
s = (X_train.dtypes == 'object')
object_cols = list(s[s].index)
print(object_cols)

# 查看標籤數據
y_train
# 查看標籤值,是一系列的浮點數
pd.unique(y_train)

3.1 數字特徵歸一化

  • 對數字特徵歸一化,避免量綱不一樣造成的權重差異
# 數字特徵,丟棄文字特徵列
num_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)
num_X_test = X_test.drop(object_cols, axis=1)

# 定義歸一化轉換器
X_scale = preprocessing.StandardScaler()
X_scale.fit_transform(num_X_train)

# 轉化後的數據是 numpy 數組
num_X_train_data = X_scale.fit_transform(num_X_train)
num_X_valid_data = X_scale.transform(num_X_valid)
num_X_test_data = X_scale.transform(num_X_test)

# 轉換後的 numpy 數組,轉成 pandas 的 DataFrame
num_X_train_scale = pd.DataFrame(num_X_train_data)
# 特徵列名稱也要重新填上
num_X_train_scale.columns = num_X_train.columns

num_X_valid_scale = pd.DataFrame(num_X_valid_data)
num_X_valid_scale.columns = num_X_valid.columns

num_X_test_scale = pd.DataFrame(num_X_test_data)
num_X_test_scale.columns = num_X_test.columns

# index 丟失,重新賦值
num_X_train_scale.index = num_X_train.index
num_X_valid_scale.index = num_X_valid.index
num_X_test_scale.index = num_X_test.index

3.2 文字特徵處理

  • 先檢查數據集之間的特徵的數值種類是否有差異,防止編碼轉換出錯
# 檢查是否有列中,數據集之間的值的種類有差異,防止編碼transform出錯,經檢查沒有bad
good_label_cols = [col for col in object_cols if
                   set(X_train[col]) == set(X_valid[col])]

# Problematic columns that will be dropped from the dataset
bad_label_cols = list(set(object_cols)-set(good_label_cols))


good_label_cols = [col for col in object_cols if
                   set(X_train[col]) == set(X_test[col])]

# Problematic columns that will be dropped from the dataset
bad_label_cols = list(set(object_cols)-set(good_label_cols))

經檢查,數據集之間的值沒有獨自特有的,可以放心使用

# 文字特徵
cat_X_train = X_train[good_label_cols]
cat_X_valid = X_valid[good_label_cols]
cat_X_test = X_test[good_label_cols]
# 文字特徵轉換成數字特徵
labEncoder = LabelEncoder()
for f in set(good_label_cols):
    cat_X_train[f] = labEncoder.fit_transform(cat_X_train[f])
    cat_X_valid[f] = labEncoder.transform(cat_X_valid[f])
    cat_X_test[f] = labEncoder.transform(cat_X_test[f])

3.3 特徵合併

  • 處理後的數字特徵與文字特徵合併
# 同樣的,index需要重新賦值,不操作此步,合併後的數據由於index不一樣,行數變多
cat_X_train.index = X_train.index
X_train_final = pd.concat([num_X_train_scale, cat_X_train], axis=1)

cat_X_valid.index = X_valid.index
X_valid_final = pd.concat([num_X_valid_scale, cat_X_valid], axis=1)

cat_X_test.index = X_test.index
X_test_final = pd.concat([num_X_test_scale, cat_X_test], axis=1)

4. 定義模型訓練

  • 定義隨機森林迴歸模型
model1 = rf(n_estimators=100)
model1.fit(X_train_final, y_train)
# cross_val_score(model1,X_train_final,y_train,cv=10,scoring='neg_mean_squared_error')
y_pred_valid = model1.predict(X_valid_final)
mean_absolute_error(y_pred_valid, y_valid)
# 驗證集上的誤差
0.1364085458333333

5. 預測

  • 對 test 數據集進行預測
y_pred_test = model1.predict(X_test_final)
result = pd.DataFrame()
result['id'] = X_test.index
result['satisfaction_level'] = y_pred_test
result.to_csv('firstsubmit.csv',index=False)

6. 新人賽結果

  • 誤差暫時最小,位列第一名
    在這裏插入圖片描述
Public分數 版本變化
0.030955617695980337 數字特徵無歸一化,隨機森林n=100
0.03099638771607572 數字特徵歸一化,隨機森林n=100
0.05741940132765499 數字特徵無歸一化,邏輯斯諦迴歸
0.05741940132765499 數字特徵歸一化,邏輯斯諦迴歸

數字特徵歸一化對LR模型沒有影響???

歸一化都無效,可能跟實際情況相關;有效無效,得從訓練速度+測試結果來衡量。

  • 比如,存在嚴重的特徵淹沒問題,歸一化就有效
  • 不存在特徵淹沒問題,歸一化就無效

歸一化的價值在於兩點:(1)提升訓練速度;(2)克服特徵淹沒問題。

特徵淹沒,一般存在與線性模型中;樹模型,各個特徵不同時使用,可能真不存在特徵淹沒問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章