十大机器学习算法(二)—— 决策树与随机森林(学习笔记)

决策树

Github:AwesomeDone

随机森林

随机森林的生成:

  1. 森林中的每棵树都是独立的

  2. bagging思想,将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器
    bagging不用单棵决策树来做预测,增加了预测准确率,即不容易过拟合,减少了预测方差

  3. 如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(采样方式称为bootstrap sample),作为该树的训练集

  4. 每棵树的训练集都是不同的,而且里面包含重复的训练样本

  5. 如果每个样本的特征维度为M,指定一个常数m<

  6. 每棵树都尽最大程度的生长,没有剪枝过程

随机森林分类效果(错误率):

  1. 森林中任意两棵树的相关性:相关性越大,错误率越大
  2. 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低
  3. 特征选择个数m(随机森林的参数):
    m越大,树的相关性和分类能力会相应提升

    如何选择最优的m是关键问题

工具

决策树工具:
from sklearn.tree import DecisionTreeClassifier
DecisionTreeClassifier(criterion='entropy')
criterion,gini或者entropy,默认是基尼系数,后者是信息熵
max_depth,决策树最大深度,默认为None
min_samples_split,内部节点再划分所需最小样本数
max_leaf_nodes,最大叶子节点数
class_weight,类别权重
随机森林工具:
from sklearn.ensemble import RandomForestClassifier
RandomForestClassifier(n_estimators=10, criterion='gini')
n_estimators,森林中决策树的个数,默认为10
max_features,寻找最佳分割时需要考虑的特征数目,默认为auto,即max_features=sqrt(n_features)
criterion,gini或者entropy,默认是基尼系数,后者是信息熵
max_depth,决策树最大深度,默认为None
min_samples_split,内部节点再划分所需最小样本数
max_leaf_nodes,最大叶子节点数
class_weight,类别权重

随机森林应用:判断用户的购买意向

数据 Info
十大机器学习算法(二)—— 决策树与随机森林(学习笔记)_第1张图片
十大机器学习算法(二)—— 决策树与随机森林(学习笔记)_第2张图片
使用随机森林回归算法,并使用 AUC 对结果进行评估。

理解AUC与ROC

import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from sklearn.preprocessing import LabelEncoder


# 数据读入
train = pd.read_csv('TRAIN_SET.csv',index_col=0)

#数据清洗
X = train.drop(['target','data_date','cust_id','fal_ind','addr_type','emp_ind','country','fcontract_date','cust_type','vip_final_date','cust_type_ms','reside_ind','foreign_ind','spouse_ind'],axis=1) # 删除一些不重要的特征

#标签编码, LabelEncoder
le = LabelEncoder()

# X['channel_entry'].replace(0, 'N')
#标签编码前转化为字符串格式
X['channel_entry'].fillna('Na')
X['channel_entry'] = [str(i) for i in X['channel_entry']]
X['sex'] = [str(i) for i in X['sex']]
X['cust_type_me'] = [str(i) for i in X['cust_type_me']]
X['cust_segment'] = [str(i) for i in X['cust_segment']]

#标签编码
X['channel_entry'] = le.fit_transform(X['channel_entry'])
X['sex'] = le.fit_transform(X['sex'])
X['cust_type_me'] = le.fit_transform(X['cust_type_me'])
X['cust_segment'] = le.fit_transform(X['cust_segment'])

#处理空数据
X.family_dep = X.family_dep.fillna(0)
X = X.fillna(-1)

#看一下数据格式是否合格
X.info()
# X.head(1000)
Y = train.target
print(Y.value_counts())

#数据切分及模型拟合
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size = 0.25, random_state = 33)
model = RandomForestRegressor(n_estimators = 50, max_depth = 10, min_samples_split = 700, random_state = 33)
model.fit(train_x, train_y)
y_pre = model.predict(test_x)

# 评估预测结果
AUC = roc_auc_score(test_y,y_pre)
print("predict result:")
print(AUC)

十大机器学习算法(二)—— 决策树与随机森林(学习笔记)_第3张图片
结果显示为0.862,还不错。

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