預測分析 · 員工滿意度預測
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/