在经过前期的学习后,我们需要一些实例操作来加深我们对pandas的熟悉程度。今天带来的是L在pandas学习之旅中,针对Adult数据集的一些学习笔记。
侦探L:pandas学习实例---Adult数据集(1)zhuanlan.zhihu.com接上一篇结尾部分,我们接下去对数据集进行分析。
首先重温一下我们的数据集。
df.head()
df.info()
下面,我们依然继续研究工资与其他特征之间的联系。
这一次我们采用机器学习中常见的决策树,来研究其他特征对工资的影响。
在上一篇的实验中我们也有看到,在工资这一列中,只有“<=50K”和“>50K”两种情况。
df['工资'].value_counts()
为了使用决策树模型对进行研究,我们需要对工资这一列数据进行一些处理,具体化处理如下:
我们将“>50K”的情况用1表示,“<=50K”的情况用0表示,研究什么条件下,工资会是“<=50K”和“>50K”。
df.loc[df['工资'] == ' <=50K', '工资'] = 0
df.loc[df['工资'] == ' >50K', '工资'] = 1
除此之外。我们还需要同时对“年龄”、“每周工作时间”以及刚刚处理过的“工资”这三列数据的数据类型进行一些修改(使用astype()函数):
df['年龄'] = df['年龄'].astype(int)
df['每周工作时间'] = df['每周工作时间'].astype(int)
df['工资'] = df['工资'].astype(int)
下面我们使用dtypes函数查看一下修改后的数据类型。
df.dtypes
同时,可以再确认一下数据集是否已修改成功:
df.head()
df.tail()
df.info()
没有缺失值,不需要进行缺失值处理。
同时,我们也可以看到,我们的数据中总共有两种类型的数据,分别为int和object,为了保证所有特征都能传入模型中,我们需要使用独热编码,将类别特征全部转换为数值类型(也即是将非数值型的数据转化为数值型)。
小科普:
独热编码_百度百科baike.baidu.com在此之前,我们先看看那些特征是object,哪些是Int的:
df_categorical
df_categorical
df_numerical
下面,对类别特征进行独热编码:
df_tree = pd.concat([df[df_numerical],
pd.get_dummies(df[df_categorical])], axis=1)
查看一下编码后的数据维度:
df_tree.shape
喜欢的同学还可以看看编码后的数据集:(由于有96列,因此这里只能显示局部)
这个时候,我们我们的数据预处理环节基本结束~
导入做决策树相应需要的包。
from sklearn import tree
from sklearn.model_selection import train_test_split
首先,将原数据集按特征和目标进行分割:
df_x = df_tree.drop(['工资'], axis=1)
df_y = df_tree['工资']
然后,使用train_test_split将数据分成训练集和测试集。
注意~在这里我们指定了拆分系数为0.3,也是说将7/10的数据作为训练集,剩下3/10的数据作为测试集。
X_train
拆分成功~查看一下拆分后训练集和测试集的数据。
X_train.shape
X_test.shape
下面开始建模,并使用X_train,和Y_train进行数据训练:
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(X_train, Y_train)
查看一下在测试集上的准确度(将经过训练集训练后的模型,应用到测试集里,并查看拟合的得分情况)
score = clf.score(X_test, Y_test)
score
得分大概在0.781左右,不是很高,我们尝试进行调参(调节建立决策树的参数,后续我会针对这一块具体写一篇)
分数变成0.812,有所提高,但是这样一次一次的调参数,看上去效率有点低,有没有效率更高的做法呢?
下面我们使用GridSearchCV 网格搜索对决策树进行调参并返回最佳参数。
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier, export_graphviz
tree_params = {'max_depth': range(3, 14)}
locally_best_tree = GridSearchCV(DecisionTreeClassifier(random_state=17),
tree_params, cv=5)
locally_best_tree.fit(X_train, Y_train)
查看一下结果:
print("最优深度:{}".format(locally_best_tree.best_params_))
clf = tree.DecisionTreeClassifier(criterion="entropy",max_depth=6, random_state=17)
clf = clf.fit(X_train, Y_train)
score = clf.score(X_test, Y_test)
print("最优深度下的得分情况:{}".format(score))
可以看到,得分情况有了进一步的提高。
import graphviz
clf = tree.DecisionTreeClassifier(criterion="entropy",max_depth=6, random_state=17)
clf = clf.fit(X_train, Y_train)
dot_data = tree.export_graphviz(clf
,out_file = None
,feature_names= feature_name
,class_names=["工资>50K","工资<=50K"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
下面是max_depth=6, random_state=17的情况:
下面我们将参数调小一点(方便放图),让大家容易看一点。
如果想要自己运行代码作出决策树的同学,需要安装相应的库。
1.安装graphviz:
下载地址:http://www.graphviz.org/。如果是windows,就在官网下载msi文件安装。安装完后要设置环境变量:将graphviz的bin目录加到PATH。
2.安装python插件graphviz:
pip install graphviz
3.安装python插件pydotplus:
pip install pydotplus
(不懂的同学可以百度一下~有空我也会专门写一篇这方面的文章)
还是和上面一样,导入库、训练数据:
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=17)
rf.fit(X_train, Y_train)
查看拟合的得分情况:
score = rf.score(X_test, Y_test)
print("随机森林的得分情况:{}".format(score))
以上便是