如何用分类模型预测消费者行为?
针对类别型变量进行分析预测的方式——逻辑回归分析
分类模型和回归模型最明显的区别在于:
- 回归模型预测的Y是数字型变量,如销售额
- 分类模型中,所预测的Y主要是类别型变量,如用户是否购买的标签只会有0(未购买)和1(购买)
什么是分类模型?
分类模型是机器通过学习与训练已有的数据,从而预测新数据的类别。
逻辑回归的定义
- 最主流的分类分析方法就是进行逻辑回归建模
- 模型性能稳定
- 模型的解释变量和目标变量之间的关系容易解释
- 逻辑回归不仅是分类模型的主力军,更是最常用的数据分析模型之一
逻辑回归模型的建立
- 建立逻辑回归模型,就是考虑在各种X的情况下,实现Y=1的概率。
- Y=1
- 用户的点击/购买/注册
- Y=0
- 用户未点击/未购买/未注册
- Y=1
- 对于每个需要预测的记录,都会生成一个预测的期望值
- 预测值,在0和1之间
- 真实值,是1或者0
- 预测值和真实值之间存在差值
逻辑回归模型的评估和优化
- 真实值和预测值会形成左图ABCD四种可能的组合。
- 评判模型预测效果的好坏时,可用预测的正确数除以总数:
- (A+D)/(A+B+C+D)
- 因此模型的优化过程就是尽可能减少
- 预测值和真实值之间的差值
- 错误预测结果的数量
![2541c1b9fb5d6de8deeb8b8802834de0.png](https://i-blog.csdnimg.cn/blog_migrate/9072936b9aed10ce354a60bdbacd0b66.png)
最常见的分类模型应用场景:
- 医疗肿瘤预测
- 垃圾邮件识别
- 个人信用评分
使用逻辑回归预测恶性肿瘤
调包与数据导入
# 导入pandas与numpy工具包。
查看数据
使用head()函数,查看前5行数据。
data.head()
数据特征解释:每个维度特征都是1~10之间的数字
- Sample code number 样本代码编号
- Clump Thickness 肿块厚度
- Uniformity of Cell Size 细胞大小的均匀性
- Uniformity of Cell Shape 细胞形状的均匀性
- Marginal Adhesion 边缘粘
- Single Epithelial Cell Size 单上皮细胞的大小
- Bare Nuclei 裸核
- Bland Chromatin 乏味染色体
- Normal Nucleoli 正常核
- Mitoses 有丝分裂
- class 类别 2为良性,4为恶性
关键步骤一:缺失值处理
发现数据中有'?', 为了后续的分析,使用replace()将异常值替换为标准缺失值,用dropna()将带缺失值的行舍弃,代码如下
# 将?替换为标准缺失值表示。
data = data.replace(to_replace='?', value=np.nan)
# 丢弃带有缺失值的数据(只要有一个维度有缺失)。
data = data.dropna(how='any')
# 输出data的数据量和维度。
data.shape
再次查看数据量和维度,发现有16行数据被舍弃低于3%,在合理范围内 。
结果解释:683条数据 9个特征 1个id 1个分类结果
data.shape
data[column_names[1:10]].head() # 只看第2到10列,省略了对第一列ID的查看
![f70e6f95f0d0756e3e5241c232f2ad75.png](https://i-blog.csdnimg.cn/blog_migrate/58cdaf726a504fc68c0e11c48105d37b.jpeg)
关键步骤二:拆分训练集和测试集
准备完数据后,可以开始逻辑回归建模,先拆分训练集和测试集 ,使用train_test_split将数据集拆分成训练集和测试集。
用test_size=0.25,意思就是75%作为训练集,25%作为测试集。调整这个系数就可以调整训练集测试集的大小
# 随机采样25%的数据用于测试,剩下的75%用于构建训练集合。
X_train, X_test, y_train, y_test = train_test_split(data[column_names[1:10]],
#特征:第0列id去掉,第10列分类结果去掉
data[column_names[10]],#第10列的分类结果作为目标分类变量
test_size=0.25,
random_state=33)
此时,可以查看测试集/训练集的样本数量和类别分布。也就是测试集与训练集中良性肿瘤的数量。
y_train.value_counts()
y_test.value_counts()
关键步骤三:标准化数据
在分类模型中,为了消除特征之间的差异性,我们需要将数据标准化,也就是说,将不同的特征值控制在一定的范围内,使得不同的特征变量具有相同的尺度。代码如下:
# 从sklearn.preprocessing里导入StandardScaler。
from sklearn.preprocessing import StandardScaler
# 从sklearn.linear_model里导入LogisticRegression
from sklearn.linear_model import LogisticRegression
# 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
关键步骤四:训练与评估模型
调用Lr中的fit模块训练模型参数,模型建立好之后需要评估训练效果,本案例中,提供了两种评估方法:从Sklearn导入分类报告及使用逻辑回归自带评分函数获得模型预测正确的百分比。代码如下:
#调用Lr中的fit模块训练模型参数
lr = LogisticRegression()
lr.fit(X_train, y_train)
lr_y_predict = lr.predict(X_test)
#评估训练效果——从Sklearn导入分类报告;
from sklearn.metrics import classification_report
print(classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
#使用逻辑回归自带评分函数获得模型预测正确的百分比
print('Accuracy of LR Classifier:', lr.score(X_test, y_test))
![2187d3ef8ad40d7d309267cac279b9cd.png](https://i-blog.csdnimg.cn/blog_migrate/90a038d84078b8deee1d0a3f90309246.png)
结果解读:
- Benign为良性,Malignant为恶性
- support为样本个数
- recall 召回率/查全率
- 患有恶性肿瘤时,被诊断出的概率
- precision 精确率/查准率
- 诊断为恶性肿瘤时,的确患有恶性肿瘤的概率
召回率与精确率我们往往会更关注其中一个指标。 在这个案例中,我们显然更关注召回率,也就是应该被正确识别的恶性肿瘤的百分比 。