问题描述
使用KNN算法训练模型,然后使用模型预测一个人的年收入是否大于50。
读取数据集并查看数据
# 导入相应库 import pandas as pd from pandas import Series,DataFrame import numpy as np
df = pd.read_csv("./adults.txt") df.head()
该数据集包含14个特征:分别为age ;workclass ;final_weight ;education ;education_num ;marital_status ;occupation ;relationship ;race ;sex ;capital_gain ;capital_loss ;hours_per_week ;native_country
其中数据集最后一列:salary表示这个人的年收入
特征工程
分割特征与标签
# 特征数据 data = df.iloc[:,:-1].copy() data.head()
# 标签数据 target = df[["salary"]].copy() target.head()
对非数值特征进行量化
由于KNN算法只能对数值类型的值进行计算,因此需要对非数值特征进行量化处理
把字符串类型的特征属性进行量化
对workclass职业这一特征进行量化
# 查看总共有多少个职业 ws = data.workclass.unique() ws
array(['State-gov', 'Self-emp-not-inc', 'Private', 'Federal-gov', 'Local-gov', '?', 'Self-emp-inc', 'Without-pay', 'Never-worked'], dtype=object)
可以看出总共有9类职业:包括未知的“?”。下面我们使用0-8这9个数字,分别对9种职业进行编码
# 定义转化函数 def convert_ws(item): # np.argwhere函数会返回,相应职业对应的索引 return np.argwhere(ws==item)[0,0] # 将职业转化为职业列表中索引值 data.workclass = data.workclass.map(convert_ws) # 查看职业转化后的数据 data.head()
np.argwhere函数会返回相应职业对应的索引, np.argwhere(ws==“?”)[0,0],返回值为5
对其他字符串特征属性进行量化
与上述职业量化过程相同
# 需要进行量化的属性 cols = ['education',"marital_status","occupation","relationship","race","sex","native_country"] # 使用遍历的方式对各列属性进行量化 def convert_item(item): return np.argwhere(uni == item)[0,0] for col in cols: uni = data[col].unique() data[col] = data[col].map(convert_item)
# 查看对所有列进行量化后的数据 data.head()
建模与评估
好了,以上我们已经将所有特征进行了量化处理,下面就可以使用KNN算法进行建模了
from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split # 创建模型 knn = KNeighborsClassifier(n_neighbors=8) # 划分训练集与测试集 x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.01) # 对模型进行训练 knn.fit(x_train,y_train) # 使用测试集查看模型的准确度 knn.score(x_test,y_test)
0.7822085889570553 • 1
模型优化
我们可以看到,如果不对上述所有的特征数值进行处理,直接使用KNN模型进行训练的话,模型的准确率仅为78%
。
下面我们对特征数据进行归一化处理,然后再使用KNN模型进行建模与测试,看看结果如何。
# 把所有的数据归一化 # 创建归一化函数 def func(x): return (x-min(x))/(max(x)-min(x))
# 对特征数据进行归一化处理 data[data.columns] = data[data.columns].transform(func) data.head()
# 划分训练集与测试集 x_train,x_test,y_train,y_test = train_test_split(data,target,test_size=0.01) # 创建模型 knn = KNeighborsClassifier(n_neighbors=8) # 训练模型 knn.fit(x_train,y_train) # 使用测试集查看模型的准确度 knn.score(x_test,y_test)
0.8374233128834356 • 1
我们可以发现,将所有数据进行归一化处理后,准确率从78%提升到了84%
,还是比较不错的。
当然还有一些其他的处理方式对模型进行优化,后续博文会持续更新,欢迎关注。
总结
这篇文章主要介绍了以下几点内容:
- 如何对字符串类型的数据进行量化处理
- 使用KNN模型对人的年收入进行预测
- 模型优化:对数据进行归一化处理之后,有利于提高模型准确度。