机器学习算法应用篇之决策树算法(sklearn)

时间:2021-07-16 10:25:09

从本篇文章开始,我将开始写机器学习算法的一系列文章,总结自己在学习应用机器学习算法过程中的学习经验与方法,主要利用工具是python的机器学习库sklearn。主要包括以下算法:决策树算法(ID3,ID4.5,CART等),朴素贝叶斯方法(Navie Bayes),支持向量基(SVM),K均值算法(K-means),PageRank,K近邻方法(KNN),遗传算法,神经网络,主成分分析方法(PCA),流型方法(ISOMAP,LLE),期望最大化方法(EM)等,不定期更新。希望大家一起学习。

1.决策树

决策树算法主要是用于处理多变量决策类问题,类似于这类问题
机器学习算法应用篇之决策树算法(sklearn)
根据你的年龄,收入,学生与否,信用卡状况来判断你是否会买电脑。根据决策树算法可以得到一棵完整的树,根据树由根节点出发可以得到是否买电脑(label)的预测。
所以决策树的定义可以为: 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

2.算法

(1)ID3算法
ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
(2)C4.5算法
ID3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。
(3)CART算法
CART(Classification And Regression Tree)算法采用一种二分递归分割的技术,将当前的样本集分为两个子样本集,使得生成的的每个非叶子节点都有两个分支。因此,CART算法生成的决策树是结构简洁的二叉树。
具体的算法介绍可以参考书或者以下几篇文章
https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html
http://blog.csdn.net/hewei0241/article/details/8280490

3.应用(sklearn)

1.读取数据

df_data_1 = pd.read_csv("data_file")

2.数据前处理(定义X,Y数据集)

df_data_1 = df_data_1.fillna("NA")#缺省数据用NA表示
exc_cols = [u'Airport Rating']
cols = [c for c in df_data_1.columns if c not in exc_cols]

X_data = df_data_1.ix[:,cols]
y_data = df_data_1[u'Airport Rating'].values[:]
#X_train1 = df_data_1.ix[:,['Airport Wi Fi Use','Boarding Area','Gender','Country','Signage Rating']]
print y_data.shape
print X_data.shape
dict_X_train = X_data.to_dict(orient='records')#列表转换为字典

3.导入模型

import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing

4.测试集、数据集、one-hot

vec = DictVectorizer()
X_data = vec.fit_transform(dict_X_train).toarray()

X_train = X_data[:1300,:]
X_test = X_data[1300:,:]
y_train = y_data[:1300]
y_test = y_data[1300:]
print X_train.shape
print X_test.shape
lb = preprocessing.MultiLabelBinarizer()
dict_y_train = lb.fit_transform(y_train)

5.建立CART树

clf = tree.DecisionTreeClassifier(criterion='gini')
clf = clf.fit(X_train,y_train)
with open("allElectronicInformationGainOri.dot", 'w') as f:
f = tree.export_graphviz(clf, feature_names = vec.get_feature_names(), out_file = f)

6.决策树可视化

! pip install pydotplus
from IPython.display import Image
dot_data = StringIO()
tree.export_graphviz(clf,
out_file=dot_data,
feature_names=vec.get_feature_names(),
filled=True,rounded=True,
impurity=False)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())

7.测试

predictedY = clf.score(X_test,y_test)
print str(predictedY)