黑马机器学习笔记(三)

决策树算法对鸢尾花分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import  DecisionTreeClassifier
def decision_iris():
   """
   用决策树对鸢尾花分类
   """
   # 1)获取数据集
   iris=load_iris()
   # 2)划分数据集
   x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
   # 3)决策树预估器分类
   estimator=DecisionTreeClassifier(criterion="entropy")
   estimator.fit(x_train,y_train)
   # 4)模型评估
   #方法1:直接比对真实值和预测值
   y_predict=estimator.predict(x_test)
   print("y_predict:\n",y_predict)
   print("直接比对真实值和预测值:\n",y_test==y_predict)
   #方法2:计算准确率
   score=estimator.score(x_test,y_test)
   print("准确率为:\n",score)


   return None

if __name__ == "__main__":
    decision_iris()

结果展示

y_predict:
 [0 2 1 2 1 1 1 1 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 2 0 1 2 2 1 0 0 1 1 1 0 0
 0]
直接比对真实值和预测值:
 [ True  True  True  True  True  True  True False  True  True  True  True
  True  True  True  True  True  True False  True  True  True  True  True
  True  True False  True  True False  True  True  True  True  True  True
  True  True]
准确率为:
 0.8947368421052632

可以看出,准确率只有0.89,没有KNN得到的准确率高,这体现了机器学习界的没有免费的午餐,意思是,不同的算法有不同的应用场景,而有些人想要用某些算法达到一劳永逸的效果

决策树可视化

保存树的结构到dot文件
1、sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])

estimator:决策树预估器对象    feature_names 特征的名字
from sklearn.tree import export_graphviz
export_graphviz(estimator,out_file="tree.dot")

在这里插入图片描述进入网站http://webgraphviz.com/生成决策树

在这里插入图片描述

决策树总结

优点:可以可视化
缺点:容易产生过拟合
改进:剪枝,随机森林

泰坦尼克号乘客生存预测

(1)乘客分类案例流程分析
准备好特征值和目标值
特征中有类别是转换成one-hot编码
获取数据–数据处理(包括缺失值处理,特征值转换成字典类型,方便处理)–筛选特征值和目标值—划分数据集—字典特征抽取—决策树预估器流程(决策树不需要做标准化)—模型评估

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 30 10:38:27 2020

@author: 86182
"""
import pandas as pd
#获取数据
#path="http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
path="E://pyProject//titanic.zip"
titanic=pd.read_csv(path)
#筛选特征值和目标值
x=titanic[["pclass","age","sex"]]
y=titanic["survived"]
#数据处理,缺失值处理
x["age"].fillna(x["age"].mean(),inplace=True)#填补平均值,inplace就地
#转换成字典
x.to_dict(orient="records")
#划分数据集
from sklearn.model_selection import train_test_split
from sklearn.tree import  DecisionTreeClassifier
from sklearn.tree import export_graphviz
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=22)
#字典特征抽取
from sklearn.feature_extraction import DictVectorizer
#实例化DictVectorizer
transfer=DictVectorizer()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)


 # 3)决策树预估器分类
estimator=DecisionTreeClassifier(criterion="entropy")#estimator是树的预估器对象
estimator.fit(x_train,y_train)
   # 4)模型评估
   #方法1:直接比对真实值和预测值
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)
   #方法2:计算准确率
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
   #可视化决策树
export_graphviz(estimator,out_file="titanic_tree.dot",feature_names=transfer.get_feature_names())

随机森林

随机森林属于集成学习方法的一种
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。(三个臭皮匠顶个诸葛亮,众人拾柴火焰高)

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

例如, 如果你训练了5个树, 其中有4个树的结果是True, 1个数的结果是False, 那么最终投票结果就是True
决策树 随机森林都是根据特征值和目标值来进行预测,决策树和随机森林的训练集是一致的,

如何对一组训练集产生多棵树,让取得的结果众数是比较准确的?
做随机就是为了让每次产生的树不一样,随机:特征值随机 训练集随机,这样可以保持树的独立性,每棵树单独地进行预测,最后求众数,得到的结果更准确

训练集和特征怎么随机生成?
训练集随机
bootstrap方法 随机有放回地抽样(可能会抽到重复的样本)
在这里插入图片描述特征随机时:从总的M个特征里面抽取m个特征,要求M>>m(可以起到降维的效果),效果还是可以的,虽然每棵树选取的特征变少了,那么有些树结果好,有些树分类结果差,分类结果好的树更容易脱颖而出

随机森林原理过程
学习算法根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
1、一次随机选出一个样本,重复N次, (有可能出现重复的样本)
2、随机去选出m个特征, m <<M,建立决策树
采取bootstrap抽样
为什么采用BootStrap抽样
为什么要随机抽样训练集?  
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
为什么要有放回地抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

随机森林对泰坦尼克号乘客的生存进行预测

#随机森林对泰坦尼克号乘客的生存进行预测
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
#实例化
estimator=RandomForestClassifier()
#加入网格搜索与交叉验证
param_dict={"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,15,25,30]}
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)#cv这里取小点,因为这里数据量太大
estimator.fit(x_train,y_train)
#5)碘型伴估
#方法1∶直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print( "y predict:ln", y_predict)
print( "直接比对真实值和预测值:in", y_test == y_predict)
#方法2∶计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:ln" , score)
#最佳参数:best params_
print("最佳参数:ln" , estimator.best_params_)
#最佳结果best_score_
print("最佳结果:1n" , estimator.best_score_)
#最佳估计器:best_estimator_
print( "最佳估计器:ln", estimator.best_estimator_)
#交叉验证结果:cv_results_
print("交叉验证结果:ln" , estimator.cv_results_)

总结

随机森林:在当前所有算法中,具有极好的准确率,能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维,能够评估各个特征在分类问题上的重要性

KNN时间复杂度较高,在大数据场景下效率较低
在这里插入图片描述朴素贝叶斯算法:当样本量不够,导致计算某些概率的时候出现了0的情况,为解决这个问题,引入了拉普拉斯平滑系数

优点:对缺失数据不敏感,而且计算速度快
缺点:假定了特征与特征之间相互独立,如果特征本身之间有关联的话,会影响最终的效果,使用贝叶斯算法的时候,会计算一些概率值,样本给的不好的话,概率值算得也不是特别准,最终的效果也不会很好
在这里插入图片描述
决策树优点:可以可视化,可解释能力强,缺点:容易过拟合,解决方案:随机森林
在这里插入图片描述

转化器用来做特征工程,预估器封装了机器学习算法
KNN:根据你的邻居推断你的类别,k取得过小容易受到异常值的影响,k取得过大,容易受到样本不均衡的影响
随机森林:三个臭皮匠,顶个诸葛亮,训练集随机:从n个样本中随机有放回地选择n个样本
特征随机:从M个特征中随机抽取m个特征
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值