Github:AwesomeDone
随机森林的生成:
森林中的每棵树都是独立的
bagging思想,将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器
bagging不用单棵决策树来做预测,增加了预测准确率,即不容易过拟合,减少了预测方差
如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(采样方式称为bootstrap sample),作为该树的训练集
每棵树的训练集都是不同的,而且里面包含重复的训练样本
如果每个样本的特征维度为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
使用随机森林回归算法,并使用 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)