目的

本文使用Python的sklearn类库,基于对随机森林算法的理论学习,利用工程中的数据,以此来对随机森林的理论知识进行一次实践总结。

利用过往1年的数据训练专家系统,目的是判断用户3个月内是否会离网。

训练集主要来自工程中的数据集,一共100万条样本数据,16个维度。

实现

导入依赖类库:

#!-*- coding:utf-8 -*-import pandas as pd
import numpy as np
import matplotlib.pylab as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV  # 网格搜索调参,即穷尽参数所有可能性
# 从本地读取训练数据
data = pd.read_csv('./decision.csv', encoding='utf-8', sep=' ')  # 以空格为分隔符,读取decision文件的内容
# 数据探索
print(type(data))  # data为DataFrame类型
print(data.shape)
print(data.head(5))  # 前5行
print(data.info())
print(data.describe())

可以通过如下数据来判断数据是否存在问题,比如年龄的最大、最小值等。

# 数据构造
col_dicts = {}
cols = data.columns.values.tolist()  # 读取所有列名
df = data.loc[:, cols[1:]]  # 获取除去第一列(user_id)的其它所有数据
print(df.shape)
X = df.loc[:, cols[1: -1]]  # 获取除去第一列(user_id)和最后一列(churn_label)的所有数据
# X = df.loc[:, cols[1: 3]]
# X.append(df.loc[:, cols[5]])
# X.append(df.loc[:, cols[8:14]])
print(X.info())

结果:

(1000000, 15)    # 100W行,15列
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000000 entries, 0 to 999999
Data columns (total 14 columns):
age                       1000000 non-null int64  # 可以看出,数据集是完整的数据集,无缺失值
net_age                   1000000 non-null int64
neto_dur                  1000000 non-null int64
chrg_dur                  1000000 non-null int64
sms_bill_cnt              1000000 non-null int64
flux_fee                  1000000 non-null int64
iset_flux                 1000000 non-null int64
arpu                      1000000 non-null int64
acct_balance              1000000 non-null int64
extend_paydate_days       1000000 non-null int64
last_year_owe_cnt         1000000 non-null int64
last_year_complain_cnt    1000000 non-null int64
ordered_prodect_cnt       1000000 non-null int64
circle_nou                1000000 non-null int64
dtypes: int64(14)
memory usage: 106.8 MB
None
# 数据拆分及类别信息查看
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)  # 20%测试集,80%训练集。固定随机种子(random_state),可以让每次划分训练集和验证集的时候都是完全一样的。
print(y_train.value_counts() / len(y_train))
print('---------')
print(y_test.value_counts() / len(y_test))

结果:

1    0.500988
0    0.499013
Name: churn_label, dtype: float64
---------
0    0.50002
1    0.49998
Name: churn_label, dtype: float64

以上结果显示正负样本比例相差不大,不存在数据倾斜。如果出现数据倾斜,可以采取如下方式进行调整:

  • 负采样;
  • 构建负样本

为了节省运算时间,子模型数(n_estimators)参数设置的比较小,实际中可以设置大一点。

# 构建随机森林模型
from sklearn import tree
from sklearn.ensemble import RandomForestClassifiercredit_model = RandomForestClassifier(n_estimators=10, n_jobs=4)  # 10个子分类器,4个CPU线程并行
# print(credit_model.fit(X_train, y_train))# 使用网格搜索训练参数
# n_estimators_range = 100  # 子模型数
max_depth_range = np.arange(5, 7, 1)  # 最大树深度
criterion_range = ['gini', 'entropy']  # 分裂条件。gini:CART树;entropy:C4.5
# 随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快
'''
选择最适属性时划分的特征不能超过此值。当为整数时,即最大特征数;当为小数时,训练集特征数*小数;if “auto”, then max_features=sqrt(n_features).If “sqrt”, thenmax_features=sqrt(n_features).If “log2”, thenmax_features=log2(n_features).If None, then max_features=n_features.
'''
max_features_range = ['auto', 'sqrt', 'log2']
param_grid = {'max_depth': max_depth_range, 'max_features': max_features_range, 'criterion': criterion_range}# GridSearch作用在训练集上
grid = GridSearchCV(credit_model, param_grid=param_grid, scoring='accuracy', n_jobs=4, cv=5)
grid.fit(X_train, y_train)

结果:

GridSearchCV(cv=5, error_score='raise-deprecating',estimator=RandomForestClassifier(bootstrap=True, class_weight=None,criterion='gini', max_depth=None,max_features='auto',max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,n_estimators=10, n_jobs=4,oob_score=False,random_state=None, verbose=0,warm_start=False),iid='warn', n_jobs=4,param_grid={'criterion': ['gini', 'entropy'],'max_depth': array([5, 6]),'max_features': ['auto', 'sqrt', 'log2']},pre_dispatch='2*n_jobs', refit=True, return_train_score=False,scoring='accuracy', verbose=0)
# 得到最优参数
print(grid.best_score_)
print(grid.best_params_)
print(grid.best_estimator_)# 训练参数调优后的模型
credit_model = RandomForestClassifier(n_estimators=10, n_jobs=4, max_depth=grid.best_params_['max_depth'], max_features=grid.best_params_['max_features'], criterion=grid.best_params_['criterion'])
# fit on the trainingt data
credit_model.fit(X_train, y_train)# 模型预测及结果分析
credit_pred = credit_model.predict(X_test)
from sklearn import metricsprint(metrics.classification_report(y_test, credit_pred))  # y_test:真实值;credit_pred:预测值
print(metrics.confusion_matrix(y_test, credit_pred))
print(metrics.accuracy_score(y_test, credit_pred))  # 预测的准确率

结果:

0.5556025
{'criterion': 'gini', 'max_depth': 5, 'max_features': 'sqrt'}
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',max_depth=5, max_features='sqrt', max_leaf_nodes=None,min_impurity_decrease=0.0, min_impurity_split=None,min_samples_leaf=1, min_samples_split=2,min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=4,oob_score=False, random_state=None, verbose=0,warm_start=False)precision    recall  f1-score   support0       0.56      0.56      0.56    1000041       0.56      0.56      0.56     99996accuracy                           0.56    200000macro avg       0.56      0.56      0.56    200000
weighted avg       0.56      0.56      0.56    200000[[55626 44378][44432 55564]]
0.55595

总结

本文简单的构造了一个随机森林,并使用网格搜索的方式对其进行超参调优,还可以使用如下方式进行调优:

  • 把连续性维度换成离散型;
  • 特征层面调优;
  • 超参数层面调优

【sklearn】随机森林 - 预测用户是否离网相关推荐

  1. sklearn—随机森林—预测一个人的月收入

    数据链接: https://pan.baidu.com/s/1366cxbt-ofzrO8EQofVTjw 提取码: q98b 我们现在拥有这样一个表格,里面包含一个成年人的['年龄','单位性质', ...

  2. 在jupytor中运行随机森林预测泰坦尼克旅客生存情况

    在jupytor中运行随机森林预测泰坦尼克旅客生存情况 数据集链接链接: link. 百度网盘:链接: https://pan.baidu.com/s/1_pQ-3iG4dr0hrvU_5hYUtg ...

  3. Python使用随机森林预测泰坦尼克号生存

    tags: 随机森林 kaggle 数据挖掘 categories: 数据挖掘 mathjax: true 文章目录 前言: 1 数据预处理 1.1 读入数据 1.2 训练集与数据集 1.2.1 查看 ...

  4. Python随机森林预测含水率

    Python随机森林预测含水率 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn. ...

  5. #第23篇分享:一个北京二手房价格数据挖掘实例(python语言:sklearn随机森林)

    #本次是做一个北京二手房的数据挖掘案例,主要是汇总一下学过的知识,并且通过实例加深一下印象,话不多说,开干: 目的:预测二手房的价格: 工具:语言python:爬虫模块scrapy,数据清洗:xpat ...

  6. RandomForest:随机森林预测生物标记biomarker——回归

    关于随机森林的简介和应用理论,请阅读之前分享的文章: 一文读懂随机森林在微生态中的应用 关于随机森林进行分类的入门实战,请阅读 之前分享的 - <RandomForest:随机森林预测生物标记b ...

  7. sklearn随机森林模型:ValueError: Unknown label type: ‘unknown‘

    sklearn随机森林模型:ValueError: Unknown label type: 'unknown' 目录 sklearn随机森林模型:ValueError: Unknown label t ...

  8. python在Scikit-learn中用决策树和随机森林预测NBA获胜者

    在本文中,我们将以Scikit-learn的决策树和随机森林预测NBA获胜者.美国国家篮球协会(NBA)是北美主要的男子职业篮球联赛,被广泛认为是首屈一指的男子职业篮球联赛在世界上.它有30个团队(美 ...

  9. 随机森林预测财务报表是否舞弊

    随机森林预测财务报表是否舞弊 爬取财务报表 设置文件保存在c盘eastmoney文件夹下 1 设置表格爬取时期 2 设置表格爬取起始页数 3 表格正式爬取 写入表头 方法1 借助csv包,最常用 数据 ...

最新文章

  1. python获取机器唯一标识_开发中常用工具 - 获取设备的唯一标识、UDID、UUID、keychain保存UUID、判断网络...
  2. StringBuider 在什么条件下使用效率更高?
  3. 新时代营销解决方案:敏捷BI助力银行高效精准营销
  4. 趣学python3(6)-条件语句
  5. HBase错误解决(启动Hbase出现错误的替换,启动hbase shell出现ERROR KeeperErrorCode=NoNode for /hbase/master)
  6. 请求网页时,怎么给我返回了一段 JavaScript 代码
  7. 计算机是如何工作的,Java多线程编程
  8. 杭电1422 重温世界杯
  9. 警惕分页中的checkbox
  10. 架构实战项目心得(十四):spring-boot结合Swagger2构建RESTful API测试体系
  11. java代码获取系统时间相差8小时
  12. ie11不兼容java_解决ie11不兼容的多个方法
  13. 【ValueError: data type <class ‘numpy.object_‘> not inexact】
  14. 学大数据开发要掌握的基础知识有哪些?
  15. 线上连锁线下整合 连锁电商建设方案
  16. ffmpeg中tbr tbc tbn的含义解释
  17. 设置Asterisk座席实时监控
  18. Java工作4年来应聘要16K最后没要,细节如下。。。
  19. 搜狗联合清华天工研究院推出ChoreoNet模型:让数字人随着音乐翩翩起舞
  20. 精确拐点交易体系之追涨停策略

热门文章

  1. K8s介绍及离线安装(四)
  2. Android 仿QQ动态背景登录
  3. 学mei私聊问我【DISTINCT】关键字有什么作用?查一个字段和多个字段的区别?
  4. 检测iPhone/iPod Touch/iPad设备类型 .
  5. 稳定性测试-几点总结
  6. 机械硬盘显示设备未就绪,要如何找回数据
  7. 深度学习和大数据之间,主要是什么关系?
  8. 判断数字的正则表达式
  9. Mac 切换 键盘布局(Colemak、dvorak、qwerty)
  10. bp神经网络推导以及物理意义