决策树decision tree+SVM+knn+随机森林+高斯贝叶斯
Decision Tree
决策树是无参数的监督学习算法,可用于分类和回归,它的目标是通过学习从数据特征推断得到的决策规则,构建一个可以预测目标变量的决策模型。
举个例子,下图来看,这个决策树,结合一些决策规则从数据中学习,得到一个近乎正弦曲线。这棵树越深,决策规则越复杂,模型越适合,越具有拟合性。
决策树的一些优点:
- 容易理解和解释,因为树是可以看到的。
- 需要很少的数据准备。 其他技术通常需要数据归一化,需要创建虚拟变量,并删除空值。 请注意,决策树不支持缺少值。
- 使用决策树的成本是训练数据的对数级。
- 能够处理数字和分类数据。其他技术通常精于分析,只有一个类型的变量的数据集。
- 能够处理多输出问题。
- 使用白盒模型。 如果在模型中可以观察到给定的情况,则可以用布尔逻辑来简单地解释。相比之下,在黑匣子模型(例如,在人造神经网络中),结果可能更难解释。
- 可以使用统计测试来验证模型,这样可以说明模型的可靠性。
- 表现良好,即使其假设与数据生成的真实模型有些违反。
决策树的一些缺点:
- 决策树学习者可以创建不能很好地概括数据的过于复杂的树。这被称为过拟合。修剪(目前不支持)的机制,设置叶节点所需的最小样本数或设置树的最大深度是避免此问题的必要条件。
- 决策树可能不够稳定,因为训练数据的小小的变化,可能会导致树的模型不一样。这个问题可以通过一个集成ensemble来解决。
- 学习最优决策树的问题。 因此,实际的决策树学习算法基于启发式算法,例如在每个节点进行局部最佳决策的贪心算法。 这样的算法不能保证返回全局最优决策树。 这可以通过在综合学习者中训练多个树来缓解,其中特征和样本随机抽样取代。(集成学习,随机森林)
- 有一些难以学习的概念,因为决策树不容易表达它们,如异或,奇偶校验或复用器问题。
- 如果某些类占主导地位,决策树学习者会创建偏僻的树。因此,建议在拟合之前平衡数据集与决策树。(预测的时候就会偏向主要的类容易造成,即欠拟合)
分类:可以二分类也可以多分类
对于scikit-learn 中的决策树DecisionTreeClassifier只需要输入两个数组,一个 X [[],[],[],[],...,[]],内部数组表示每个样本;一个Y [inter values] 类别由整数表示。
#coding=utf-8
'''测试scikit-learn决策树的简单用法'''
from sklearn import tree
import matplotlib.pyplot as plt
#训练样本
X=[[0,0,1],[1,1,0],[0,1,0],[1,0,1]]
#训练样本类别
Y=[0,1,0,1]
#按照信息熵来作为划分标准
clf=tree.DecisionTreeClassifier(criterion='entropy')#相当于一个分类树函数
print clf
clf.fit(X,Y) #拟合数据集,也就是训练树的过程
#测试集,预测测试集样本的类别,必须要是一个二维数组。
print clf.predict([[1,1,1],[0,0,0],[1,0,1]])
#预测每个测试样本的对每个类别的概率也就是分数
print clf.predict_proba([[1,1,1],[0,0,0],[1,0,1]])
返回结果
#一个决策树对象
DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_split=1e-07, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=None, splitter='best')
[1 0 1] #预测的类别
#每个样本在每个类别上的概率
[[ 0. 1.]
[ 1. 0.]
[ 0. 1.]]
很多分类器的用法都相似的,下面针对一个训练集(特征向量+类别)
介绍几种常用的分类器方法:
数据集的介绍:
kaggle 中 泰坦尼克号的数据集,通过某些特征提取的方法构造成清洗后的数据集,同时按相同的处理方法处理测试集。
七个特征属性+一个决策属性
不同分类器方法的用法:
XTrain与YTrain是训练集的特征和类别。
TestDataset是测试集
#1.决策树的用法,下面训练决策树
from sklearn import tree
clf=tree.DecisionTreeClassifier(criterion='entropy')
#信息熵划分属性,默认是gini指数
print clf
#根据当前数据,拟合决策树,也就是训练决策树
clf.fit(XTrain,YTrain)
#所有测试样本的预测label
predictLabels=clf.predict(TestDataset)
#2.用随机森林预测类别
from sklearn.ensemble import RandomForestClassifier #导入随机森林方法
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(XTrain, YTrain)
Y_pred = random_forest.predict(TestDataset)
for x in Y_pred:
print x
#3.支持向量机 SVM
from sklearn.svm import SVC
#Support Vector Machines
svc = SVC()
svc.fit(XTrain, YTrain)
Y_pred = svc.predict(TestDataset)
#svm是排4025名
SVM的多分类用法:
#SVM预测
def useSVM(Xtrain,Ytrain,Xtest,Ytest):
lin_clf = svm.LinearSVC()
lin_clf.fit(Xtrain, Ytrain)
Y_pred = lin_clf.predict(Xtest)
return Y_pred
#4.Gaussian Naive Bayes 高斯朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
gaussian = GaussianNB()
gaussian.fit(XTrain, YTrain)
Y_pred = gaussian.predict(TestDataset)
print gaussian.score(XTrain, YTrain)
for x in Y_pred:
print x
#高斯朴素贝叶斯是4000多名 0.76077
#4.下面是用knn来看看
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=15)
knn.fit(XTrain, YTrain)
Y_pred = knn.predict(TestDataset)