zoukankan      html  css  js  c++  java
  • 人工智能_5_决策树_随机森林

    # 决策树,随机森林
    # 决策树结构:if-then
    # 信息熵:
    #   例:第一届世界杯32支球队 每个队伍冠军概率1/32
    #               可得 log32(程序员认为的log一般都默认是以2为底) = -(1/32*log(1/32)+1/32*log(1/32).....)
    #           2018 第21届世界杯根据历史数据获胜概率不同   log32  > -(1/4*log(1/4)+1/4*log(1/4).....)
    #           几个log的和即为信息熵,   当概率变化时  log的和是小于log(n)的
    # 信息熵与不确定性是相联系的
    #   H(X)= -(P(X1)log(P(X1))+P(X2)log(P(X2))......)   概率相同时为log(n)
    #       信息熵越大表示 几率均等,不确定性大
    # 决策树的划分依据:信息增益 (最大值对应的特征即为重要特征)
    #   当得知一个特征条件之后,减少的信息熵的大小 (构建决策树时,放在前边)
    #   得知x特征的信息,是的类y的信息的不确定性减少的程度
    #   Ck表示某个类的样本数,即某类目标值的数量
    #       g(D,A) 特征A对数据集D的信息增益g(D,A)
    #       H(D) 数据集的信息熵 (根据目标值求) H(D) = -((|C1|/|D|)/log(|C1|/|D|)+(|C2|/|D|)/log(|C2|/|D|)+......)
    #       H(D,A) 给定条件下D的信息熵 H(D,A) = -( (|Di|/|D|)*H(Di) )
    #           例:特征A为年龄,有青年,中年,老年  H(D,A) 表示为 -( 青年占所有的比例*H(青年)+ 中年,老年 )
    #                       H(青年) = 值看青年的数据集    根据目标值  = - ( (目标值1/所有青年数)log(目标值1/所有青年数)+....)
    #    即可根据此 生成决策树
    # 常用算法 (有的使用基尼系数(不在分析实现方法),有的使用信息增益)
    #   ID3 使用信息增益最大的原则
    #   C45 信使用息增益比最大的准则
    #   CART
    #       回归树:平方误差最小
    #       分类树 基尼系数(划分更加仔细,可以指定数的深度等等) 最小的准则 在skleran中选择划分的默认原则
    # API
    #   sklearn.tree.DecisionTreeClassifier(Criterion='gini',max_depth=None,random_state=None)
    #   决策树分类器
    #   criterion:默认是gini系数,也可选择信息增益的熵entroy
    #   max_depth:树的深度大小
    #   random_state:随机数种子
    #   method:
    #   decision_path:返回决策树的路径
    # API sklearn.tree.export_graphviz() 导出DOT格式
    #   tree.export_grahviz(estimator,out_file="",features_names=[])
    #   将dot转换为图片格式
    #   sudo apt-get install graphviz
    #   dot -Tpng tree.dot -o tree.png
    # ==================================
    # 案例:泰坦尼克号------>根据游客的信息,判断游客是否存活
    # 数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
    #       age 项有空缺
    #   "row.names","pclass","survived","name","age","embarked","home.dest","room","ticket","boat","sex"
    #   "1","1st",1,"Allen, Miss Elisabeth Walton",29.0000,"Southampton","St Louis, MO","B-5","24160 L221","2","female"
    def decision():
        import pandas as pd
        """
        决策树
        :return: 
        """
        # 1,获取数据
        taitan =pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
        # 2,处理数据,获取特征值与目标值
        x = taitan[['pclass','age','sex']]
        y = taitan['survived']
        # 3,处理缺失值
        x['age'].fillna(x['age'].mean(),inplace=True) # inplace 表示填补
        # 4,分割数据
        from sklearn.model_selection import train_test_split
        x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
    
        # 5,特征处理 (对于类别的)使用one-hot编码(将数据转换为数字的形式:例如性别,使用0,1代替)
        from sklearn.feature_extraction import DictVectorizer
        dict = DictVectorizer(sparse=False)
        # to_dict() 把原来的 数据转换为 [{'sex':"male"},{}]格式
        x_train = dict.fit_transform(x_train.to_dict(orient="records"))
    
        x_test = dict.transform(x_test.to_dict(orient="records"))
        # 6,决策树处理
        from sklearn.tree import DecisionTreeClassifier
        dec = DecisionTreeClassifier()
        # dec = DecisionTreeClassifier(max_depth=5)
        dec.fit(x_train,y_train)
        print("准确率:",dec.score(x_test,y_test))
        # 导出决策树结构
        from sklearn.tree import export_graphviz
        export_graphviz(dec,out_file="./tree.dot",feature_names=["age","pclass=1st","pclass=2nd","pclass=3rd","女性","男性"])
    # 优点
    #   简单的理解和解释 树木可视化
    #   不需要归一化
    # 缺点(太过于详细,有些异常点)
    #   创建的树不能很好的适用于测试集:过拟合
    # 改进
    #   减枝cart算法 (指定叶子属性:例如若到达该叶子的样本数少于5,就不要了)
    #   随机森林
    # ==========================================================
    # 集成学习方法----随机森林
    #   集成学习方法:多个分类器或模型组合
    #   什么是随机森林:包含多个分类器,最后的结果取众数
    #   随机森林的过程,优势(n个样本,m个特征
    #       单个树的建立过程:
    #           1,随机在n个中抽取一个样本,重复n次 样本可能重复
    #           2,随机在m个特征中选出M个特征 M<m
    #       建立10个树,样本,特征大多不同   随机又放回的抽样 bootstrap抽样
    # API sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion="gini" 使用基尼系数
    # ,max_depth=None,bootstrap=True,random_state=None)
    #   n_estimators:数量个数默认是10 一般是120,200,300,500,800,1200
    #   max_features="auto" 决策树最大的特征数量,(选取的特征太多,容易过拟合)
    #   auto:特征数开方,sprt=auto,log2,None
    def random_forest():
        import pandas as pd
        """
       随机森林
        :return: 
        """
        taitan =pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
        x = taitan[['pclass','age','sex']]
        y = taitan['survived']
        x['age'].fillna(x['age'].mean(),inplace=True)
        from sklearn.model_selection import train_test_split,GridSearchCV
        x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
        from sklearn.feature_extraction import DictVectorizer
        dict = DictVectorizer(sparse=False)
        x_train = dict.fit_transform(x_train.to_dict(orient="records"))
        x_test = dict.transform(x_test.to_dict(orient="records"))
        from sklearn.ensemble import RandomForestClassifier
        rf = RandomForestClassifier()
        # 网格搜索与交叉验证
        gc =GridSearchCV(rf,param_grid={"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,15,25,30]},cv=2)
        gc.fit(x_train,y_train)
        print("随机森林准确率",gc.score(x_test,y_test))
        print("随机森林选择的参数模型",gc.best_params_)
    # 极好的准确率,有效使用在大数据,不需要降维
    if __name__ =="__main__":
        #decision()
        random_forest()
  • 相关阅读:
    fastcgi(一)
    矩阵旋转运算(一)
    【10.9】multiprocessing多进程编程
    【10.8】多线程和多进程的比较
    【10.7】ThreadPoolExecutor线程池
    【10.6】线程同步--Semaphore 使用以及源码分析
    【10.5】线程同步--conditon 使用以及源码分析
    【10.4】线程同步--Lock、RLock
    【10.3】线程间通信--共享变量和Queue
    【10.2】多线程编程-threading
  • 原文地址:https://www.cnblogs.com/Dean0731/p/11630972.html
Copyright © 2011-2022 走看看