随机森林开始

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

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

 

 

决策树

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()

 

 

posted @ 2019-06-20 14:12  程序杰杰  阅读(315)  评论(0编辑  收藏  举报