如何预测用户流失概率并用Python实现(附案例代码)

mac2024-02-20  51

01 生活中,我们经常遇到以下问题

如何预测一个用户是否购买某件商品?

如何预测用户流失概率?

如何判断用户的性别?

如何预测用户是否点击某商品?

如何判断一天评论是正面还是负面?

预测用户是否点击某个广告

如何预测肿瘤是否是恶性的等等

02 如何选择算法模型解决问题?

现实中的这些问题可以归类为分类问题 或者是二分类问题。逻辑回归是为了就是解决这类问题。根据一些已知的训练集训练好模型,再对新的数据进行预测属于哪个类,并且概率是多少。比如用户是否点击某个广告、肿瘤是否是恶性的、用户的性别,等等。

逻辑回归(Logistic regression 或logit regression),即逻辑模型(英语:Logit model,也译作“评定模型”、“分类评定模型”)是离散选择法模型之一,主要是针对因变量为分类变量而进行回归分析的一种统计方法,属于概率型非线性回归。它的有点是算法简单高效,在实际生活中应用广泛;缺点是离散型的数据需要通过生成虚拟变量进行使用。

02 什么是逻辑回归?

逻辑回归是一种广义的线性回归,通过构造回归函数,利用sklearn库实现分类或预测。它使用的函数是Sigmoid函数,也称为s函数,双弯曲线。它把数据集分为0-1区间,然后根据0.5把数据分两类。一类是(0.5 –1);另外一个类是(0——0.5)。当x>0是, 我们把数据归为一类,x<0时,我们把数据归为另一类。

在逻辑回归中,x使用一个y表示,也就是y=f(x1,x2,x3)= a1x1+a2x2+….+anxn。逻辑回归的关键是找到a1,a2,,,an的参数,然后就得到y,进而得到x。最后就可以根据x预测属于哪一类。

03 案例:运用逻辑回归预测用户是否购房

已知某公司的地产中介数据库,包括年龄、教育水平、房屋所有等信息。请根据已知用户信息预测是否购买房产。

是否购买房产是二分问题。用户要么购买,要么租房。这些信息可以使用0 1 表示。我们使用逻辑回归实现该问题。

04 解析流程

因为预测的结果是一个是否题目,要么购买、要么租房。它符合逻辑回归特征。但是数据集中包含很多离散类型变量,需要进行虚拟化处理。首先,我们可以确定逻辑回归流程

代码如下:

import pandas from sklearn.linear_mode import LogisticRegression def main():    """        主函数流程    :return:    """    file_name = 'data.csv'    # 预测数据 自变量    predict_aim = 40    # 第一步 数据处理    processed_data = process_data(file_name)    # 第二步 转换数据类型    input_data, output_data = data_2_category(processed_data)    # 第三步 建立逻辑回归模型    logistic_model = model_data(input_data, output_data)    # 第四步 根据模型预测结果    predict_data(logistic_model) if __name__ == '__main__':    # 主函数    main()

05 第一步:数据处理

数据处理主要是导入数据集,然后对其进行处理。首先,我们使用pandas.read_csv读取数据文件,然后通过data.shape查看数据集中包括3187行,21列。最后,我们使用dropna()去除数据集中的缺失值,去除后还剩下3085行。如果不去除这些值,它们会影响模型的训练。因此,数据挖掘的第一步就是清理数据,使得它整洁干净,符合数据挖掘算法的要求。(文末扫码 获得源代码和数据集)

06 第二步:虚拟化处理

由于数据集中包括离线类型数据,比如性别等列,我们需要对其进行虚拟化处理。这些变量分有大小意义与无大小的变量。(文末扫码 获得源代码和数据集)

虚拟化处理 def data_2_category(processed_data):    '''        第二步:转换数据集            把离散型数据转化为连续型数据分两部分:            第一部分:无大小意义的数据 使用get_dummies()处理            第二部分:有大小意义的数据 使用map()处理    :param processed_data:    :return:    '''    # 处理无大小意义的数据    print('*' * 20)    print('开始处理无大小意义的列')    dummies_data = data_2_category_get_dummies(processed_data)    # print(dummies_data.columns)    # 处理有大小意义的数据,返回处理后的数据集    print('*' * 20)    print('开始处理有大小意义的列')    dummies_data_final = data_2_category_map(dummies_data)

07 第三步:建立回归模型

我们使用sklearn中的逻辑回归模型对数据建模。首先,创建模型logistic_model,然后使用fit()训练输入与输出数据,进而得到模型的评分是0.8424635332252837。符合预期,我们可以使用该模型进行预测

建立模型 def model_data(input_data, output_data):    '''        第三步:建立回归模型    :param input_data:    :param output_data:    :return:    '''    logistic_model = LogisticRegression()    # 训练数据集    logistic_model.fit(input_data, output_data)    # 评分数据集    logistic_model_score = logistic_model.score(input_data, output_data)    print(f'数据集的逻辑回归得分是{logistic_model_score}')    return logistic_model 数据集的逻辑回归得分是0.8424635332252837

08 第四步:预测

根据模型评分,我们可以看使用它进行预测。对新的数据集预测,我们也需要三步骤。

第一步:数据处理主要是导入数据,并且删除确实。

第二步:处理离散值变量为虚拟变量

第三步:由于模型已经创建成功,我们只需要使用并且预测数据。

根据预测结果,我们得知[0 0 0 0 0 0 0 0]。这说明数据集中的每个人都购置房产。

预测数据 def predict_data(logistic_model):    """        根据训练集的模型,我们可以进行对新的数据集进行预测    :param logistic_model:    :return:    """    print()    print('*' * 20)    print('* 开始处理新的数据')    print('*' * 20)    file_name = 'newData.csv'    # 第一步 数据处理    new_data = process_data(file_name)    print(new_data.shape)    # 第二步:转换数据类型    input_new_data,output_new_data = data_2_category(new_data)    print('得到新的数据集的输入')    print(input_new_data.shape)    print(output_new_data.shape)    # 第三步:预测数据    result_input = logistic_model.predict(input_new_data)    print('预测后的结果是:')    print(result_input)    # 输出预测的属性    proba_input = logistic_model.predict_proba(input_new_data)    print('每一个类别的概率是:')    print(proba_input)    # 回归方程的参数是    coef_log = logistic_model.coef_    print('回归方程的参数是:')    print(coef_log)    # 截距    intercept_input = logistic_model.intercept_    print('回归方程的截距是:')    print(intercept_input) 得到新的数据集的输入 (8, 35) (8, 1) 预测后的结果是: [0 0 0 0 0 0 0 0] 每一个类别的概率是: [[0.7919836  0.2080164 ] [0.87626858 0.12373142] [0.94658152 0.05341848] [0.98407936 0.01592064] [0.8974075  0.1025925 ] [0.93894934 0.06105066] [0.91021008 0.08978992] [0.95289655 0.04710345]] 回归方程的参数是: [[-9.21438094e-02 -6.24883209e-01 -9.69316011e-01 -4.47613809e-01   1.89401190e-01  1.04775826e-01  4.66224817e-04  1.92878643e-01   1.99245876e-01  4.27647983e-02 -6.95829770e-02  9.99518066e-02   1.85677580e-01  4.04643649e-01  2.77475439e-01  4.63136576e-01   1.18515339e-01  8.80706906e-01 -1.29244267e-02 -6.26125189e-01   5.52697914e-02 -3.26483869e-01  3.38429268e-01  4.69881067e-01   9.03829123e-01  3.76992082e-01  4.31214139e-01  3.25470843e-01   1.78913910e-02  5.74949532e-01  9.43142296e-01  4.56312427e-01   8.51014333e-01  2.42053025e-01  6.95736936e-01]] 回归方程的截距是: [3.49839379]

请扫码获得完整代码,手把手指导你学Python

只需7天时间,跨进Python编程大门,已有3800+加入

【基础】0基础入门python,24小时有人快速解答问题;

【赠予】后续圈主将开发python,0基础入门在线课程,免费送给圈友们,供巩固和系统化复习

(三重福利)最近入圈送大礼包:

1、2.7G、308份最新数据分析报告

最新回复(0)