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


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

  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

煙台治療胃腸哪家好:http://mobile.ytwcbyy.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM