KNN综合案例

问题描述

salary.txt文件调查了32561名美国居民的信息,包括年龄,教育年限,工作类别,收入等,数据解雇如下所示
在这里插入图片描述
以薪水(salary)作为目标值,建立薪水预测模型
在这个模型中,要包括以下部分:
(1)去掉无用特征
(2)去掉缺失值所在的行
(3)将值为字符串的字段转化为one-hot编码
(4)标准化
(5)PCA降维
(6)划分数据集
(7)KNN预测
(8)交叉验证与网格化搜索,要调的参数包括:k,p,weights

(1)导入模块

在这里插入图片描述

(2)导入数据并初步选择特征

导入数据,并将无用的字段去掉
在这里插入图片描述

(3)数据预处理

a 缺失值处理

在这里插入图片描述
可以看到,workclass这一列有问号,问号通常表示缺失值

将问号替换成np.nan,方便使用dropna
在这里插入图片描述
去掉缺失值所在的行
在这里插入图片描述
可以看到,workclass这一列,已经没有nan了,于此同时,记录也损失了两千多行

b 从清洗后的数据中获得特征值和目标值

在这里插入图片描述

c 将特征分成两部分,即字符串特征和数字特征

在这里插入图片描述

d 将字符串特征转换为one-hot编码

在这里插入图片描述

e 将one-hot编码后的特征与数字特征水平拼接

在这里插入图片描述

f 标准化

在这里插入图片描述

(3)PCA降维,保留95%的信息

在这里插入图片描述

(4)将新数据划分为训练集和测试集

在这里插入图片描述

(5)KNN预测

在这里插入图片描述

(6)交叉验证与网格化搜索

在这里插入图片描述
因为30162的算术平方根为173,因此k最大只能为173,为了方便,让k最大取170
由于太参数网格化搜索太花时间,因此建议到服务器上运行。

(7)最佳参数及其对应的模型

在这里插入图片描述

(8)代码整合

上面的交叉验证时,分的是二折,这里使用4折

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import StandardScaler

"""导入数据"""
data = pd.read_csv('F:/拜师培训/4168_Sklearn_v2/V2-sklearn第二节资料/day02代码/knn/salary.txt')

"""数据处理"""
# 将不影响结果的数据去掉
data.drop(labels=['final_weight','education','capital_gain','capital_loss'],
          axis = 1, inplace=True)

# 将问号替换掉
data.replace('?', np.nan, inplace=True)

# 去掉 nan 所在的行
data.dropna(axis=0, inplace=True)

# 从清洗后的数据中获得特征值和目标值
X = data.iloc[:, 0:-1]
y = data['salary']

# 将字符串所在的字段进行one-hot编码
# 将需要编码的字段名放到一个列表中
cols = ['workclass', 'marital_status', 'occupation',
        'relationship', 'race', 'sex','native_country']

# 将所有的字符串字段整理成一个DataFrame,即字符串特征
X_string = X[cols]

# 将所有的数值字段整合成一个DataFrame,即数字特征
X_number = X[[col_num for col_num in X.columns if col_num not in cols]]

# 将特征为字符串的字段转化成one-hot编码
ohe = OneHotEncoder()
X_onehot = ohe.fit_transform(X_string)
X_onehot = X_onehot.toarray()

# 将one-hot编码后的特征,与数字特征水平连接
new_X = np.hstack((X_onehot, X_number))  # 两重括号

'''标准化'''
std = StandardScaler()
new_X = std.fit_transform(new_X)

'''PCA降维'''
pca = PCA(n_components=0.95)
new_data = pca.fit_transform(new_X)

'''将新数据划分为训练集和测试集'''
X_train, X_test, y_train, y_test = train_test_split(new_data, y)

'''KNN训练及预测'''
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
score = knn.score(X_test, y_test)
print('k=5时的预测结果:')
print(score)

'''交叉验证与网格化搜索'''
para = {"n_neighbors": [1, 3, 5, 7, 10, 20, 50, 100, 150, 170],
       'p':[1, 2],
       'weights':['distance', 'uniform']}
gc = GridSearchCV(knn, param_grid=para, cv=4)
gc.fit(X_train, y_train)
print()
print()
print('最好的模型:')
print(gc.best_estimator_)
print('最好的模型对应的参数:')
print(gc.best_params_)
print('最好的模型在训练集上的准确率:')
print(gc.best_score_)
print('最好的模型在测试集上的准确率:')
print(gc.score(X_test, y_test))

输出

k=5时的预测结果:
0.8195199575653096


最好的模型:
KNeighborsClassifier(n_neighbors=20)
最好的模型对应的参数:
{'n_neighbors': 20, 'p': 2, 'weights': 'uniform'}
最好的模型在训练集上的准确率:
0.8232614801836379
最好的模型在测试集上的准确率:
0.8244264686381116

(9)总结

可以看到,本案例中KNN的准确率并不是很高,但本例的综合性很强,将缺失值处理、字符串转one-hot编码、数据标准化、PCA降维、数据集划分、KNN、交叉验证与网格化搜索都串起来了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值