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

guoduan發表於2020-05-30

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

  Michael阿明 2020-05-28 20:41:56 944 收藏 2 原力計劃

  分類專欄: 機器學習

  版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。

  本文連結:https://blog.csdn.net/qq_21201267/article/details/106274328

  收起

  文章目錄

  1. 匯入工具包

  2. 讀取資料

  3. 特徵處理

  3.1 數字特徵歸一化

  3.2 文字特徵處理

  3.3 特徵合併

  4. 定義模型訓練

  5. 預測

  6. 新人賽結果

  競賽地址

  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)克服特徵淹沒問題。

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

  ————————————————

  版權宣告:本文為CSDN博主「Michael阿明」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

  原文連結:https://blog.csdn.net/qq_21201267/article/details/106274328


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69971700/viewspace-2695178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章