本文在adult数据集上进行了实验,运用14个基本属性预测工资状况是否高于50K。采用了随机森林和支持向量机的方法进行实验。对原始数据进行了异常值处理和属性数字化的预处理操作,得到实验数据。实验1对数据进行十折交叉验证取十次结果平均值作为最终结果,度量方法为准确率,分别在两种模型上做对比实验。实验2采用两次留出法划分了训练集、验证集、测试集,以验证集为数据、以准确率作为标准调整模型参数,结果分别列出了两种模型下的查全率、查准率和F1值。经过两次实验验证,在adult数据集上,随机森林较支持向量机有更好的分类效果。
1. Adult数据集预处理(数据预处理见实验2:dealdata函数)
1) 去除缺失值:原始数据中包含缺失数据,需进行清理,采用删除条目的方式去除缺失值。原始数据共计32561条,清理后为30162条。正例共计7508条,反例22654条。
2)属性数字化:原始文件描述属性时使用文字形式,需将文字转化成数字作为模型输入。
2. 实验1:十折交叉方法及准确率度量
十折交叉验证是常用的测试方法。将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。
每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计。
import pandas as pd
import numpy as np
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import warnings
warnings.filterwarnings("ignore")
# 数据预处理并获得训练集测试集
# 从数据集中获得原始数据
adult_digitization = pd.read_csv("data_cleaned.csv")
# 构造输入和输出
X = adult_digitization[
['age', 'workclass', 'fnlwgt', 'education', 'education_number', 'marriage', 'occupation', 'relationship',
'race',
'sex', 'capital_gain', 'apital_loss', 'hours_per_week', 'native_country']]
Y = adult_digitization[['income']]
# 交叉验证
preaccrf = []
preaccsvm = []
num = 1
kf = KFold(n_splits=10)
for train, test in kf.split(X):
X_train, X_test = X.loc[train], X.loc[test]
Y_train, Y_test = Y.loc[train], Y.loc[test]
rf = RandomForestClassifier(oob_score=False, random_state=10, criteri