机器学习笔记06:决策树和随机森林

决策树和随机森林

文章目录

  • 决策树和随机森林
    • 1.决策树
    • 2.随机森林

1.决策树

  1. 信息熵:
    机器学习笔记06:决策树和随机森林_第1张图片
    信息是和不确定性相关的,当知道了一些信息后,不确定性下降了,信息熵也下降。
  2. 信息增益:得知一个特征条件之后,减少信息熵的程度。
    在这里插入图片描述
    机器学习笔记06:决策树和随机森林_第2张图片
    信息增益哪个大哪个排在前面,进行分类。
  3. class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
    决策树分类器
    criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
    max_depth:树的深度大小
    random_state:随机数种子

method:
decision_path:返回决策树的路径

# decision_tree
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris,fetch_20newsgroups,load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction import DictVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier,export_graphviz


def decision():
    
    # 获取数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    
    # 处理数据
    x = titan[['pclass','age','sex']]
    
    y = titan['survived']
    # 缺失值处理
    
    x['age'].fillna(x['age'].mean(),inplace = True)
    
    
    # 分割数据集到训练集和测试集
    
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25)
    
    # 进行处理(特征工程)特征-》类别->one-hot编码
    dict = DictVectorizer(sparse = False)
    
    x_train = dict.fit_transform(x_train.to_dict(orient = 'records'))
    
    x_test = dict.fit_transform(x_test.to_dict(orient = 'records'))

    
    # 决策树
    
    dec = DecisionTreeClassifier(max_depth=10)  # 会影响树的形状
    dec.fit(x_train,y_train)
    
    print(dec.score(x_test,y_test))
    
    # 导出决策树的结构
    
    export_graphviz(dec,out_file='./tree.dot',feature_names=['1','2','3','4','5','6'])

    return None

if __name__ == "__main__":
    decision()
    # 导出决策树的结构
    
    export_graphviz(dec,out_file='./tree.dot',feature_names=['1','2','3','4','5','6'])

机器学习笔记06:决策树和随机森林_第3张图片

  1. 决策树的优缺点:
    优点:
    简单的理解和解释,树木可视化。
    需要很少的数据准备,其他技术通常需要数据归一化,
    缺点:
    决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
    决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成。
  2. 决策树的改进:
    剪枝cart:防止树木变得很大
    随机森林

2.随机森林

  1. 集成学习方法:
    集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
  2. 随机森林:包含很多决策树的分类器,多个决策树去投票。
  3. 过程:N个样本,M个特征
    1. 单个树建立:随即在N个样本中选择一个,重复N次,样本有可能重复(一共N个可能有重复的)
    2. 随即在M个特征中选出m个特征,m取整
    3. 最终:样本特征大多不一样,是随机有放回的抽样bootstrap

机器学习笔记06:决策树和随机森林_第4张图片

# decision_tree
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris,fetch_20newsgroups,load_boston
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction import DictVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.ensemble import RandomForestClassifier


def decision():
    
    # 获取数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    
    # 处理数据
    x = titan[['pclass','age','sex']]
    
    y = titan['survived']
    # 缺失值处理
    
    x['age'].fillna(x['age'].mean(),inplace = True)
    
    
    # 分割数据集到训练集和测试集
    
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.25)
    
    # 进行处理(特征工程)特征-》类别->one-hot编码
    dict = DictVectorizer(sparse = False)
    
    x_train = dict.fit_transform(x_train.to_dict(orient = 'records'))
    
    x_test = dict.fit_transform(x_test.to_dict(orient = 'records'))

    
    # 随机森林
    rf = RandomForestClassifier()
    
    param = {'n_estimators':[120,200,300,500,800,1200],'max_depth':[5,8,15,25,30]}
    
    # 网格搜索与交叉验证
    gc = GridSearchCV(rf,param_grid=param,cv = 2)
    
    gc.fit(x_train,y_train)
    
    print('准确率',gc.score(x_test,y_test))
    print('查看选择模型',gc.best_params_)    

    return None

if __name__ == "__main__":
    decision()

在这里插入图片描述

  1. 优点:
    在当前所有算法中,具有极好的准确率。
    能够有效地运行在大数据集上。
    能够处理具有高维特征的输入样本,而且不需要降维。
    能够评估各个特征在分类问题上的重要性。
    对于缺省值问题也能够获得很好得结果。

你可能感兴趣的:(机器学习,机器学习)