文章目录
sklearn中利用决策树实现隐形眼镜类型的预测
一、准备数据集
- 数据集的介绍
隐形眼镜数据集是非常著名的数据集,它包含很多眼部状态的观察条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括硬材质(hard)、软材质(soft)以及不适合佩戴隐形眼镜(no lenses)。整个数据集一共有24组数据,数据的Labels依次是age、prescript、astigmatic、tearRate、class,也就是第一列是年龄,第二列是症状,第三列是是否散光,第四列是眼泪数量,第五列是最终的分类标签。
- 数据集的下载
下载地址:https://github.com/Jack-Cherish/Machine-Learning/blob/master/Decision%20Tree/lenses.txt
二、环境的准备
- 安装sklearn
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sklearn
- 安装pydotplus
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pydotplus
- 安装Graphviz
下载地址:https://www.graphviz.org/download/
安装过程,按照安装向导的指示进行。如果按照过程,没有选择自动添加PATH
,需要自行手动添加环境变量。
添加环境变量过程:
选择我的电脑->属性->高级->环境变量。在系统变量的Path变量中,添加Graphviz的环境变量,若Graphviz安装在了D盘的根目录,则添加:D:\Graphviz\bin
三、DecisionTreeClassifier构建决策树的部分参数说明
- criterion
特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼系数,使用该参数的时候,是采用的CART算法实现决策树的。entropy是信息增益,也就是采用的ID3算法实现决策树的。 - splitter
特征划分点选择标准,可选参数,默认是best,可以设置为random。best参数是根据算法选择最佳的切分特征,random随机的在部分划分点中找局部最优的划分点。“best"适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐使用"random”。 - max_depth
决策树最大深度,可选参数,默认是None。当模型样本很多的时候,可以取值10-100。 - min_samples_split
内部节点再划分所需最小样本数,可选参数,默认是2。当min_samples_split为整数,min_samples_split作为划分的最小样本数,若样本已经少于min_samples_split个样本,则停止继续划分。当min_samples_split为浮点数,那么min_samples_split就是一个百分比,ceil(min_samples_split * n_samples),数是向上取整的。如果样本量数量级非常大,则增大这个值。 - min_samples_leaf
叶子节点最少样本数,可选参数,默认是1。如果min_samples_leaf是整数,那么min_samples_leaf作为最小的样本数。如果是浮点数,那么min_samples_leaf就是一个百分比,celi(min_samples_leaf * n_samples),数是向上取整的。如果样本量数量级非常大,则增大这个值。
更多参数的详细信息内容参考下面链接:
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html说明:一般都使用决策树默认的参数设置,若自行设置参数的值,根据实际情况进行设定。
四、利用决策树实现隐形眼镜类型的预测
- 读取数据集
得到的是stringfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder #from sklearn.externals.six import StringIO from six import StringIO from sklearn import tree import pandas as pd import numpy as np import pydotplus if __name__ == '__main__': fr = open('lenses.txt') lenses = [inst.strip().split('\t') for inst in fr.readlines()] print(lenses)
- string类型的数据序列化
lenses_target = [] #提取每组数据的类别,保存在列表里 for each in lenses: lenses_target.append(each[-1]) lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] #特征标签 lenses_list = [] #保存lenses数据的临时列表 lenses_dict = {} #保存lenses数据的字典,用于生成pandas for each_label in lensesLabels: #提取信息,生成字典 for each in lenses: lenses_list.append(each[lensesLabels.index(each_label)]) lenses_dict[each_label] = lenses_list lenses_list = [] print(lenses_dict) #打印字典信息 lenses_pd = pd.DataFrame(lenses_dict) #生成pandas.DataFrame print(lenses_pd) le = LabelEncoder() #创建LabelEncoder()对象,用于序列化 for col in lenses_pd.columns: #序列化 lenses_pd[col] = le.fit_transform(lenses_pd[col])
序列化
- 构建决策树
clf = tree.DecisionTreeClassifier(max_depth = 4) #创建DecisionTreeClassifier()类 clf = clf.fit(lenses_pd.values.tolist(), lenses_target) #使用数据,构建决策树
- 决策树的可视化
dot_data = StringIO() tree.export_graphviz(clf, out_file = dot_data, #绘制决策树 feature_names = lenses_pd.keys(), class_names = clf.classes_, filled=True, rounded=True, special_characters=True) graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) graph.write_pdf("tree.pdf")
- 预测
可以根据自己的眼睛情况和年龄等特征,看一看自己适合何种材质的隐形眼镜print(clf.predict([[1,1,1,0]]))
sklearn中利用决策树实现鸢尾花分类
一、数据集
- 数据集获取
#导入相应的包 from sklearn import datasets #导入方法类 from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, OneHotEncoder #from sklearn.externals.six import StringIO from six import StringIO from sklearn import tree import pandas as pd import numpy as np import pydotplus from sklearn.metrics import accuracy_score # 获取所需数据集 iris=datasets.load_iris() #每行的数据,一共四列,每一列映射为feature_names中对应的值 X=iris.data #每行数据对应的分类结果值(也就是每行数据的label值),取值为[0,1,2] Y=iris.target #通过Y=iris.target.size,可以得到一共150行数据,三个类别个50条数据,并且数据是按照0,1,2的顺序放的 #print(iris)
- 数据集划分
#划分训练集和测试集,按照7:3的比例划分 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42) print(X_train.shape) print(X_test.shape)
二、利用决策树实现鸢尾花分类
- 构建决策树
clf = tree.DecisionTreeClassifier() lenses = clf.fit(X_train, Y_train)
- 决策树可视化
dot_data = StringIO() tree.export_graphviz(clf, out_file = dot_data, #绘制决策树 feature_names = iris.feature_names, class_names = iris.target_names, filled=True, rounded=True, special_characters=True) graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) graph.write_pdf("treeiris.pdf")
- 预测准确率
predict_results = clf.predict(X_test) # 使用模型对测试集进行预测 print(accuracy_score(predict_results, Y_test))
总结
sklearn实现决策树的过程
- 对数据集进行处理
- 使用tree.DecisionTreeClassifier()进行构建
- 使用clf.fit(X_train, Y_train)进行训练
- 将构建的决策树可视化
- 给相应的数据进行预测