用 KNN 对 IBM员工进行离职预测

KNN算法的思想: 如果一个吸烟者70岁得了肺癌 ,另一个吸烟者69岁得了肺癌,且大多吸烟者这个时间段可能有肺癌风险。那么有个样本 68岁的吸烟者也很有可能近期会得肺癌。KNN就是找身边最相似的东西,进而进行预测。

1.首先获取IBM员工数据集:

首先登录天池大数据平台,里面有一个 天池实验室--数据集--公共数据中     有一个 IBM员工离职数据集

具体 链接为   :     https://tianchi.aliyun.com/dataset/dataDetail?dataId=77180

 

2.对字段(特征)进行分析:

这里的字段实在太多,因为初学KNN,我们使用其中的几个字段(特征)就好了

这里我们使用


age:年龄字段 
bussinessTravel : 是否经常出差
DistanceFromHome: 距离
Education:教育程度
gender:  性别
joblevel:  工作等级
MonthlyIncome :   员工月收入
numcompanies:     曾经工作过公司数量

 

这8个字段来进行预测   是否离职                attrition字段表示 是否离职

    (也就是说,我们用这8个字段来预测   attrition字段)

并且我们统一 Department字段  为   Research & Development      ( Research & Development表示研发部门)

在这个数据集中,一共有 1400多条数据集

我们在 Department字段为Research & Development 中         选取90 条为 训练集,选取10条作为数据集 

因为这里选取了8个字段  ,一般数据集为  k的平方比较好     (一些大佬说的,我也不太明白)

 

3.进行数据清洗

这里有1400多条数据的30多个特征 ,我们只需要100条数据 8-9个特征就好了

所以需要删除多余的行和列

代码如下:

import pandas as pd
xdate=pd.read_csv('WA_Fn-UseC_-HR-Employee-Attrition.csv')   # i

# xdate.sort_values(by='Department')       # 按列排序,没啥用
df=xdate
df = df.drop(df[df.Department!= 'Research & Development'].index)#  首先删除部门不是   研究部   的行

need_list=[            # 需要保留的字段合集
'Age',
'Attrition',
'BusinessTravel',
'DistanceFromHome',
'Education',
'JobLevel',
'NumCompaniesWorked',
'MonthlyIncome',
'Gender']

delete_list=[]   # 需要删除的列表


for i in df:
    if i not in need_list:
        delete_list.append(i)


df.drop(labels=delete_list,axis=1,inplace=True)            # 删除没用的列
print(len(df))
df = df.head(100)                 # 取前100行

alldate=df                        # 所有数据集
alldate.to_csv('alldate.csv')                     # 保存成csv 文件

4.将 文本数据    转成    数学数据

for index in alldate['BusinessTravel'].index:
    value=alldate['BusinessTravel'].get(index)
    if value =='Travel_Frequently':
        alldate['BusinessTravel'][index]=2   
    elif value == 'Travel_Rarely':
        alldate['BusinessTravel'][index]=1    
    else:
        alldate['BusinessTravel'][index]=0            # 把BussinessTravel字段的 频繁出差转成 2    很少转1,不出差转 0 
        
for index in alldate['Gender'].index:
    value=alldate['Gender'].get(index)
    if value=='Male':
        alldate['Gender'][index]=1
    else:
        alldate['Gender'][index]=0                    # 把gender字段  male转成0, female转0
alldate.to_csv('alldate_1.csv')

5.先保存一部分数据

train = alldate.head(90)                          # 前90行为训练集 
train_y = train['Attrition']                      # train_y  为我们需要预测的字段  (该字段表示是否离职) 
train_x = train.drop('Attrition',axis=1)          # train_x  为预存Attrition 所需要的特征
train_y.to_csv('train_y.csv')              
train_x.to_csv('train_x.csv')

test = alldate.tail(10)                           # 后10行为测试集
test_y = test['Attrition']                        # test_y   为 我们通过 test_x 和 train_x 预测是否离职 和实际数据对比 
test_x = test.drop('Attrition',axis=1) 
test_y.to_csv('test_y.csv') 
test_x.to_csv('test_x.csv')

6.数据标准化

如果不标准化,会发生什么 ? 

首先,我们得 知道 KNN的算法究竟是  什么   样子 的   

如果一个人的特征有这些   (身高,体重,收入)

第一个特征的取值为(150-190)CM

第二个特征取值为(40-80) KG

第三个为  (5000-20000) 

假如两个人的指标为 (160,50,8000)  (180,60,10000)

我们需要算出距离最近,也就是找 最相似的东西     比如距离可以表示 为 sqrt((160-180)^2+(50-60)^2+(8000-10000)^2)

那么,第三个指标,对结果的影响,会显著性的大 ,所以 要进行标准化

这里需要用到 sklearn.preprocessing 库 

        代码如下:

from sklearn.preprocessing import MinMaxScaler, StandardScaler
std = StandardScaler()
normal_test_x = std.fit_transform(test_x)
normal_train_x = std.fit_transform(train_x)

7.使用knn对结果进行预测

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier()
knn.fit(normal_train_x,train_y)
y_predict = knn.predict(normal_test_x)
print(knn.score(normal_test_x,test_y))          

# 这里得出的结果为 0.8,其实把数据扩大,训练集为800条,测试集为100条时,准确率会提升到  0.88

 

全部代码如下:

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
xdate = pd.read_csv('WA_Fn-UseC_-HR-Employee-Attrition.csv')   # i
df = xdate
df = df.drop(df[df.Department != 'Research & Development'].index)#  首先删除部门不是   研究部   的行
need_list = [            # 需要保留的字段合集
'Age',
'Attrition',
'BusinessTravel',
'DistanceFromHome',
'Education',
'JobLevel',
'NumCompaniesWorked',
'MonthlyIncome',
'Gender']

delete_list = []   # 需要删除的列表

for i in df:
    if i not in need_list:
        delete_list.append(i)

df.drop(labels=delete_list, axis=1, inplace=True)            # 删除没用的列
df = df.head(100)                 # 取前100行
alldate = df                        # 所有数据集
alldate.to_csv('alldate.csv')


for index in alldate['BusinessTravel'].index:
    value = alldate['BusinessTravel'].get(index)
    if value == 'Travel_Frequently':
        alldate['BusinessTravel'][index] = 2
    elif value == 'Travel_Rarely':
        alldate['BusinessTravel'][index] = 1
    else:
        alldate['BusinessTravel'][index] = 0  # 把BussinessTravel字段的 频繁出差转成 2    很少转1,不出差转 0

for index in alldate['Gender'].index:
    value = alldate['Gender'].get(index)
    if value == 'Male':
        alldate['Gender'][index] = 1
    else:
        alldate['Gender'][index] = 0  # 把gender字段  male转成0, female转0

alldate.to_csv('alldate_1.csv')

train = alldate.head(90)                          # 前90行为训练集
train_y = train['Attrition']                      # train_y  为我们需要预测的字段  (该字段表示是否离职)
train_x = train.drop('Attrition', axis=1)          # train_x  为预存Attrition 所需要的特征
train_y.to_csv('train_y.csv')
train_x.to_csv('train_x.csv')

test = alldate.tail(10)                           # 后10行为测试集
test_y = test['Attrition']                        # test_y   为 我们通过 test_x 和 train_x 预测是否离职 和实际数据对比
test_x = test.drop('Attrition', axis=1)
test_y.to_csv('test_y.csv')
test_x.to_csv('test_x.csv')

std = StandardScaler()
normal_test_x = std.fit_transform(test_x)
normal_train_x = std.fit_transform(train_x)

knn = KNeighborsClassifier()
knn.fit(normal_train_x, train_y)
y_predict = knn.predict(normal_test_x)
print(knn.score(normal_test_x, test_y))

# 这里得出的结果为 0.8,其实把数据扩大,训练集为800条,测试集为100条时,准确率会提升到  0.88

 

 

 

 

 

 

注:向量标准化的语法格式  可以尝试尝试

from sklearn.preprocessing import MinMaxScaler, StandardScaler
std = StandardScaler()
date = std.fit_transform([[22],[49],[43],[36],[51],[32],[45],[38],[30],[30]])
print(date)

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值