案例:某产品召回预测

案例背景

本案例中所使用的数据为某产品召回前调查,出于敏感信息保密原则,具体字段名称做了一定的替换。主要的字段有四个渠道的消费和时长以及和客服沟通的次数等

数据读取与划分

# 导入相应的包
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, roc_auc_score, roc_curve, accuracy_score

# 读入数据
data = pd.read_csv('./case_random_forest.csv', encoding='gbk')
# 查看数据具体信息
data.head()
业务1使用次数渠道1时长渠道1访问次数渠道1消费渠道2时长渠道2访问次数渠道2消费渠道3时长渠道3访问次数渠道3消费渠道4时长渠道4访问次数渠道4消费与客服沟通次数isrun
025265.111045.07197.49916.78244.79111.0110.032.701False
126161.612327.47195.510316.62254.410311.4513.733.701False
20243.411441.38121.211010.30162.61047.3212.253.290False
30299.47150.9061.9885.26196.9898.866.671.782False
40166.711328.34148.312212.61186.91218.4110.132.733False
# 划分数据集,按照训练集测试集7:3进行划分
labels = np.array(data.pop("isrun"))
train, test, train_labels, test_labels = train_test_split(data, labels,
                                                          stratify = labels,
                                                          test_size = 0.3,
                                                          random_state = 114)

train = train.fillna(train.mean())
test = test.fillna(test.mean())  # Features for feature importances 
features = list(train.columns)

模型搭建与训练

# 建立模型
trees = RandomForestClassifier(n_estimators=20, random_state=114, criterion='gini', max_features = 'sqrt')
trees.fit(train, train_labels)
RandomForestClassifier(max_features='sqrt', n_estimators=20, random_state=114)
# 查看建立的随机森林的具体信息,主要查看每棵树的节点个数以及平均深度
n_nodes = []
max_depths = []
for ind_tree in trees.estimators_:
    n_nodes.append(ind_tree.tree_.node_count)
    max_depths.append(ind_tree.tree_.max_depth)
print(f'Average number of nodes {int(np.mean(n_nodes))}')
print(f'Average maximum depth {int(np.mean(max_depths))}')
Average number of nodes 379
Average maximum depth 19
# 查看评价标准
probs = trees.predict_proba(test)[:, 1]
predictions = trees.predict(test)
print(f'Test ACC Score: {accuracy_score(predictions, test_labels)}')
print(f'Test ROC AUC  Score: {roc_auc_score(test_labels, probs)}')
Test ACC Score: 0.906
Test ROC AUC  Score: 0.821895543456342
# 找出影响最大的变量
fi_model = pd.DataFrame({'feature': features,
                        'importance': trees.feature_importances_}).\
                        sort_values('importance', ascending = False)
fi_model.head(10)
featureimportance
1渠道1时长0.149806
3渠道1消费0.148304
13与客服沟通次数0.132728
4渠道2时长0.078845
6渠道2消费0.078460
7渠道3时长0.056919
12渠道4消费0.051537
2渠道1访问次数0.048397
8渠道3访问次数0.047986
10渠道4时长0.045726
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐