zoukankan      html  css  js  c++  java
  • 随机森林开始

    随机森林 是并行的思想(集体智慧)

      大大减少了单机的运算量和有效的排除了异常值对我们决策的影响

     

    决策树

    import numpy as np
    import pandas as pd
    from sklearn.datasets import load_iris
    from sklearn.tree import DecisionTreeClassifier #决策树类别
    from sklearn.tree import export_graphviz
    from sklearn.tree import DecisionTreeRegressor #决策树做回归
    from sklearn.model_selection import train_test_split    #切分训练集和测试集的比例~~
    from sklearn.metrics import accuracy_score  #metrics指标 accuracy_score评估准确率
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    
    iris=load_iris()
    print(list(iris.keys()))
    print(iris["feature_names"])
    data=pd.DataFrame(iris["data"])#将数据转成pandas的数据集
    data["Species"]=iris.target          #增加一列
    # print(data)
    
    x=data.iloc[:,:2] #花萼的长度 和 宽度
    y=data.iloc[:,-1] #最后一列Species种类  》》就是0 1 2
    
    #把原有数据集切成两部分
    #train_size=0.75  》75%训练集 25%测试集
    #random_state写死每次运行切割数据都是一样的,不写死的话系统会每次随机赋值,》》就会使得每次的数据内容是不一样的
    x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.75,random_state=42)
    
    #max_depth=2限制数的深度只有2层
    #分割的标准
    tree_clf=DecisionTreeClassifier(max_depth=8,criterion='entropy')
    tree_clf.fit(x_train,y_train)
    y_test_hat=tree_clf.predict(x_test)
    # print(y_test_hat)
    #评估准确度,正例就对,负例纠错,得出浮点数  *100就是百分比
    print("acc score:",accuracy_score(y_test,y_test_hat))
    
    print(tree_clf.predict_proba([[5,1],[1,1.5]]))#[[0. 1. 0.],[1. 0. 0.]] 说明[5,1]属于1类型 [1,1.5]属于0类别
    print(tree_clf.predict([[5,1],[1,1.5]]))#[1 0]
    
    #决策树类别的max_depth参数每次都是自己手动调节参数太麻烦,我们让代码自动实现
    depth=np.arange(1,15)
    err_list=[]
    for d in depth:
        clf=DecisionTreeClassifier(max_depth=d,criterion='entropy')
        clf.fit(x_train,y_train)
        y_test_hat=clf.predict(x_test)
        result=(y_test_hat==y_test)
        # if d==1:
        #     print(result)
        #     print(np.mean(result))#True为1  False为0
        err=1-np.mean(result)
        # print(err*100)
        err_list.append(err)
        # print(d,"错误率:%.2f%%"%(err*100))
    
    mpl.rcParams['font.sans-serif']=['SimHei']#把字体设置为黑体
    plt.figure(facecolor='w')#图的底色是白色.
    plt.plot(depth,err_list,'ro-',lw=2)#横坐标,纵坐标,'ro-'(红色,每个点画成o用-连接),lw线宽
    plt.xlabel('决策树深度',fontsize=15)
    plt.ylabel('错误率',fontsize=15)
    plt.title('决策树深度和过拟合',fontsize=18)
    plt.grid(True)
    plt.show()

     

    随机森林

    from sklearn.ensemble import RandomForestClassifier#随机森林
    from sklearn.model_selection import train_test_split#分隔的方式
    from sklearn.ensemble import BaggingClassifier #装袋分类器
    from sklearn.tree import DecisionTreeClassifier#决策树
    from sklearn.metrics import accuracy_score#metrics指标 accuracy_score评估准确率
    from sklearn.datasets import load_iris
    import numpy as np
    import matplotlib as mlt
    import matplotlib.pyplot as plt
    
    iris=load_iris()
    print(list(iris.keys()))
    print(iris["feature_names"])
    x=iris["data"][:,:2]#花萼的长度和宽度
    y=iris["target"]
    
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.33,random_state=42)
    
    #n_estimators=500用500颗小决策树构成森林  max_leaf_nodes最大叶节点数 n_jobs用几个线程
    rnd_clf=RandomForestClassifier(n_estimators=100,max_leaf_nodes=16,n_jobs=1)
    rnd_clf.fit(x_train,y_train)
    
    #这个
    #max_samples=1.0 训练整个样本(是来随机样本的比例)
    #splitter="random"每个小树取出所有样本但是使用随机的维度,主要在于随机维度,而不在于随机样本数
    bag_clf=BaggingClassifier(
        DecisionTreeClassifier(splitter="random",max_leaf_nodes=16),
        n_estimators=100,max_samples=1.0,bootstrap=True,n_jobs=1
    )
    bag_clf.fit(x_train,y_train)
    y_pred_bg=bag_clf.predict(x_test)
    print(accuracy_score(y_test,y_pred_bg))
    
    y_pred_tf=rnd_clf.predict(x_test)
    print(accuracy_score(y_test,y_pred_tf))
    count=np.arange(10,500,10)
    err_list=[]
    n_estimators_list=[]
    for i in count:
        t_rnd_clf=RandomForestClassifier(n_estimators=i,max_leaf_nodes=16,n_jobs=1)
        t_rnd_clf.fit(x_train,y_train)
        y_pred_tf=t_rnd_clf.predict(x_test)
        err_list.append(1-accuracy_score(y_test,y_pred_tf))
        n_estimators_list.append(i)
    #找出错误率最低的小决策树数量
    minnum=err_list[0]#初始化
    for i in err_list:
        if i<minnum:
            minnum=i
    minindex=err_list.index(minnum)
    minerroCount=n_estimators_list[minindex]
    countR=np.arange(10,50)
    err_listR=[]
    for i in countR:
        t_rnd_clfR=RandomForestClassifier(n_estimators=minerroCount,max_leaf_nodes=i,n_jobs=1)
        t_rnd_clfR.fit(x_train,y_train)
        y_pred_tf=t_rnd_clfR.predict(x_test)
        err_listR.append(1-accuracy_score(y_test,y_pred_tf))
    
    
    mlt.rcParams['font.sans-serif']=['SimHei']#把字体设置为黑体
    
    fig=plt.figure(facecolor='w')#图的底色是白色.
    ax1=fig.add_subplot(2,1,1)
    ax1.plot(count,err_list,'rp-',lw=2)#横坐标,纵坐标,'ro-'(红色,每个点画成o用-连接),lw线宽
    plt.title('决策树深度和过拟合',fontsize=18,c='skyblue')
    plt.xlabel('决策树深度',fontsize=15)
    plt.ylabel('错误率',fontsize=15)
    plt.grid(True)
    ax2=fig.add_subplot(2,1,2)
    ax2.plot(countR,err_listR,'ro-',lw=2)
    plt.title('决策树深度和过拟合mm',fontsize=18,c='skyblue')
    plt.xlabel('决策树深度mm',fontsize=15)
    plt.ylabel('错误率mm',fontsize=15)
    # ax1.title('决策树深度和过拟合',fontsize=18)
    # ax1.grid(True)
    plt.grid(True)
    plt.show()
    
    #Feature Importance
    iris=load_iris()
    #n_jobs=-1不限制线程数,有几线程就用几个线程
    rnd_clf=RandomForestClassifier(n_estimators=500,n_jobs=-1)
    rnd_clf.fit(iris["data"],iris["target"])
    #feature_importances_随机森林和决策树的副产品,可以做特征的提取
    #就是fit(x,y) x的每个维度和y的相关度
    for name,score in zip(iris["feature_names"],rnd_clf.feature_importances_):
        print(name,score)
    #上方输出结果
    # sepal length (cm) 0.10375860847964496
    # sepal width (cm) 0.024341448023000867
    # petal length (cm) 0.4439466177026777
    # petal width (cm) 0.42795332579467654

     

    决策树回归

    from sklearn.tree import DecisionTreeRegressor#决策树回归
    import numpy as np
    import matplotlib.pyplot as plt
    
    n=100
    x=np.random.rand(n)*4-1
    x.sort()
    
    y=np.sin(x)+np.random.rand(n)*0.05
    # print(y)
    
    x=x.reshape(-1,1)#变成2维 每个列表只有一个列向量,行自适应,每个只有一列
    # print(x)
    
    dt_reg=DecisionTreeRegressor(criterion="mse",max_depth=3)
    dt_reg.fit(x,y)
    
    x_test=np.linspace(-3,3,50).reshape(-1,1)#-3~3 平均分成50个数,然后一个列只有一列
    # print(x_test)
    y_hat=dt_reg.predict(x_test)
    # print(y_hat)
    '''
    plt.plot(x,y,'m*',label="actual")
    plt.plot(x_test,y_hat,'r-',lw=2,label='predict')
    # print(help(plt.legend))
    plt.legend(loc="best")
    plt.grid()
    plt.show()
    '''
    depth=[2,4,6,8,10]
    color="ygbym"
    x_test=np.linspace(-3,3,50).reshape(-1,1)
    plt.plot(x,y,'r*',label="actual")
    for d,c in zip(depth,color):
        dt_reg=DecisionTreeRegressor(criterion="mse",max_depth=d)
        dt_reg.fit(x,y)
        y_hat=dt_reg.predict(x_test)
        plt.plot(x_test,y_hat,'-',color=c,lw=2,label='depth=%d'%d)
    plt.legend(loc="best")
    plt.grid(b=True)
    plt.show()

  • 相关阅读:
    操作系统
    Typora
    C++
    linux sftp 和scp 运用
    python GIL锁与多cpu
    django model 高级进阶
    django template 模板
    django view 视图控制之数据返回的视图函数
    django 创建管理员用户
    jango 模型管理数据model入门
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/11058439.html
Copyright © 2011-2022 走看看