拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机器学习4:逻辑回归简介、原理、API函数和案例、分类问题评估、电信客户流失预测案例

机器学习4:逻辑回归简介、原理、API函数和案例、分类问题评估、电信客户流失预测案例 逻辑回归简介原理把线性回归处理后的值-通过Sigmoid激活函数 映射到[0,1]之间-结合阈值划分正负样本极大似然估计它的核心思想是找到一个参数值使得观测到的样本数据出现的概率即似然函数最大。求导是为了找极值使得似然函数值最大确保估计的准确性这种只用于似然函数导数存在和单峰值的情况逻辑回归原理逻辑回归API函数和案例 案例 演示逻辑回归模型实现癌症预测 逻辑回归模型介绍 概述 属于有监督学习即有特征有标签且表示是离散的 主要适用于二分类 原理把线性回归处理后的预测值-通过Sigmoid激活函数映射到[0,1]概率-基于自定义的阈值结合概率来分类 损失函数 极大似然估计函数的负数形式 回顾机器学习项目流程 1.加载数据 2.数据预处理 3特征工程(特征提取特征预处理特征降维特征选择特征组合 4.模型训练 5.模型预测 6.模型评估 #导包 import numpy as np import pandas as pd from sklearn.linear_model import LogisticRegression#逻辑回归模型 from sklearn.preprocessing import StandardScaler#标准化 from sklearn.model_selection import train_test_split#训练集和测试机分割 from sklearn.metrics import accuracy_score#模型评估 # 1.加载数据 datapd.read_csv(./datas/breast-cancer-wisconsin.csv) data.info()#查看数据信息 # 2.数据预处理 #2.1把替换成np.nan,参1:要被替换的值参2:用来替换的值 参3是否替换源数据默认为False data.replace(?,np.nan,inplaceTrue) #2.2缺失值处理-删除 原本有699个数据但有16个脏数据所以删除后剩683个数据 data.dropna(axis0,inplaceTrue)#axis0表示行删除包含缺失值的行 #2.3打印处理后的信息 data.info() # 3特征工程(特征提取特征预处理特征降维特征选择特征组合 #3.1特征提取之提取特征和标签 xdata.iloc[:,1:-1]#按照行号列索引获取数据,:表示所有行,1:-1表示从第1列到最后1列包左不包右 ydata.iloc[:,-1]#获取最后一列 # ydata.iloc[Class]#获取最后一列效果同上 # ydata.Class#获取最后一列效果同上 #3.2查看下特征和标签 print(x[:5]) print(y[:5]) print(x.shape,y.shape) #3.3切割训练集和测试集 x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.2,random_state23) #3.4特征工程:标准化 #3.4.1创建标准化对象 transferStandardScaler() #3.4.2对训练集进行标准化 训练标准化 x_traintransfer.fit_transform(x_train) #3.4.3对测试集进行标准化 标准化 x_testtransfer.transform(x_test) # 4.模型训练 #4.1创建模型对象-逻辑回归模型 estimatorLogisticRegression() #4.2模型训练 estimator.fit(x_train,y_train) # 5.模型预测 y_preestimator.predict(x_test) print(f预测值为{y_pre}) # 6.模型评估 #正确率准确率公式为预测对的/样本总数 print(f预测前评估,正确率:{estimator.score(x_test,y_test)}) #测试集的特征标签 print(f预测后评估正确率:{accuracy_score(y_test,y_pre)}) #测试集的标签预测值 #思考逻辑回归模型能用准确率来评测吗? # 答案: 可以, 但是结果不精准, 因为逻辑回归模型主要用于 二分类, 即: A类还是B类, 不能说 97%的A类, 3%的B类. # 所以要通过 混淆矩阵来评测, 即: 精确率, 召回率, F1值(F1-Score), ROC曲线, AUC值.分类问题评估混淆矩阵True Positive 表示样本真实的类别Positive 表示样本被预测为的类别精确率你抓到的坏人中,真正的坏人占的比例;召回率: 真正的坏人,你抓到的比率.精确率、召回率、F1-score 案例 演示混淆矩阵和精确率召回率F1值 回顾逻辑回归 概述属于有监督学习即有特征有标签且标签是离散的 适用于二分类 评估精确率、召回率、F1值 混淆矩阵 概述 用来描述真实值和预测值之间关系的 图解 预测标签正例 预测标签反例 真实标签正例 真正例 伪反例 真实标签反例 伪正例 真反例 单词 True真False假 Positive正例 Negative反例 结论 1.模拟使用分类少的充当正例 2.精确率真正例在预测正例中的占比tp/(tpfp) 3.召回率真正例在真正例中的占比tp/(tpfn) 4.F1值2*(精确率*召回率)/(精确率召回率) #导包 import pandas as pd from sklearn.metrics import confusion_matrix,precision_score,recall_score,f1_score#混淆矩阵精确率召回率F1值 #需求已知有10个样本6个恶性肿瘤正例4个良性肿瘤反例 #模型A预测结果为预测对了3个恶性肿瘤预测对了4个良性肿瘤 #模型B预测结果为预测对了6个恶性肿瘤预测对了1个良性肿瘤 #请针对于上述的数据集搭建混淆矩阵并分别计算模型A、模型B的精确率召回率F1值 #1.定义变量记录样本数据 y_train[恶性,恶性,恶性,恶性,恶性,恶性, 良性,良性,良性,良性] #2.定义变量记录模型A预测结果 y_pre_A[恶性,恶性,恶性,良性,良性,良性, 良性,良性,良性,良性] #3.定义变量记录模型B预测结果 y_pre_B[恶性,恶性,恶性,恶性,恶性,恶性, 良性,恶性,恶性,恶性] #4.用标签标记正例和反例 lable[恶性,良性] df_lable[恶性(正例),良性(反例)] #5.针对于真实值(y_train)和模型A预测结果(y_pre_A),搭建混淆矩阵 cm_Aconfusion_matrix(y_train,y_pre_A) print(f混淆矩阵A:{cm_A}) #6.为了测试结果更好看把上述的混淆矩阵转换成DataFrame df_Apd.DataFrame(cm_A,indexdf_lable,columnsdf_lable) print(f混淆矩阵A的DataFrame对象形式:\n{df_A}) #7.针对于真实值(y_train)和模型B预测结果(y_pre_B),搭建混淆矩阵 cm_Bconfusion_matrix(y_train,y_pre_B) print(f混淆矩阵A:{cm_B}) #8.为了测试结果更好看把上述的混淆矩阵转换成DataFrame df_Bpd.DataFrame(cm_B,indexdf_lable,columnsdf_lable) print(f混淆矩阵A的DataFrame对象形式:\n{df_B}) #9.计算模型A的精确率召回率F1值 print(f模型A精确率:{precision_score(y_train,y_pre_A,pos_label恶性)})#参1真实值参2预测值参3正例标签 print(f模型A的召回率:{recall_score(y_train,y_pre_A,pos_label恶性)})#参1真实值参2预测值参3正例标签 print(f模型A的F1值{f1_score(y_train,y_pre_A,pos_label恶性)})#参1真实值参2预测值参3正例标签 #9.计算模型B的精确率召回率F1值 print(f模型B精确率:{precision_score(y_train,y_pre_B,pos_label恶性)})#参1真实值参2预测值参3正例标签 print(f模型B的召回率:{recall_score(y_train,y_pre_B,pos_label恶性)})#参1真实值参2预测值参3正例标签 print(f模型B的F1值{f1_score(y_train,y_pre_B,pos_label恶性)})#参1真实值参2预测值参3正例标签AUC指标、ROC曲线电信客户流失预测案例因为机器学习需要数字类型. 通过热编码把文字0,12..等转为数字, 且编码后的0,1,2不存在大小关系,就不会误导模型, 分类表达和结果才准确 案例 电信客户流失案例分析 目的: 1. 演示逻辑回归的相关操作, 主要是: 二分法(流失, 不流失) 2. 演示逻辑回归的评估操作, 主要是: 混淆矩阵, 准确率, 召回率, F1值, ROC曲线, AUC值, 分类评估报告(了解) #导包 import pandas as pd import numpy as np from matplotlib import pyplot as plt import seaborn as sns from sklearn.linear_model import LogisticRegression #混淆矩阵准确率精确率召回率F1值ROC曲线AUC值分类评估报告(了解) from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, f1_score, roc_curve, auc, \ classification_report, recall_score, roc_auc_score from sklearn.model_selection import train_test_split #1.定义函数用于实现数据预处理 def data_preprocess(): #1.读取数据 datapd.read_csv(./datas/churn.csv) data.info() print(data.head(5))#原来的字符串列是Churn和gender #2.因为上述的Churngender是字符串类型的我们要对其进行热编码(one-hot)处理 datapd.get_dummies(data) data.info() print(data.head(5))#热编码后的结果将上面的两列换成了4列Churn_NoChurn_Yesgender_Malegender_Female这是bool类型 #但是上面4列太冗余了我们可以删除其中的一列 #3.删除列 参数1要删除的列名 参数2删除的是列 参数3是否在原数据上进行修改 data.drop([Churn_No,gender_Male],axis1,inplaceTrue) data.info() print(data.head(5)) #4.修改列名将Churn_Yes定义为标签列flag data.rename(columns{Churn_Yes:flag},inplaceTrue) data.info() print(data.head(5)) #5.查看一下数据集中标签是否是均衡的 print(data[flag].value_counts())#False:不流失True:流失 #2.定义函数用于数据的可视化显示月度会员的流失情况 def data_visualization(): #1.读取数据 datapd.read_csv(./datas/churn.csv) #2.对上述数据做热编码处理 datapd.get_dummies(data) #3.删除冗余列 data.drop([Churn_No,gender_Male],axis1,inplaceTrue) #4.修改列名将Churn_Yes定义为标签列flag data.rename(columns{Churn_Yes:flag},inplaceTrue) #5.查看数据集的分布情况 print(data.flag.value_counts()) print(data.columns)#查看数据集的列名 #6.通过技术柱状图绘制(月度会员的流失情况) sns.countplot(data,xContract_Month,huez flag) plt.show() #3.定义函数用于实现逻辑回归模型的训练与评估 def data_LogisticRegressionModel(): #1.读取数据 datapd.read_csv(./datas/churn.csv) #2.数据预处理 #2.1对上述数据做热编码处理 datapd.get_dummies(data) #2.2删除冗余列 data.drop([Churn_No,gender_Male],axis1,inplaceTrue) #2.3修改列名将Churn_Yes定义为标签列flag data.rename(columns{Churn_Yes:flag},inplaceTrue) #3.特征工程(特征提取特征预处理:标准还、归一化...)这里不用 #划分数据集为训练集和测试集 xdata[[Contract_Month,PaymentElectronic,internet_other]] ydata[[flag]] x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.2,random_state42) #4.创建逻辑回归模型并训练 #4.1创建逻辑回归对象 estimatorLogisticRegression() #4.2训练模型 estimator.fit(x_train,y_train) #5.模型预测 y_preestimator.predict(x_test) print(f预测值为{y_pre}) #6.模型评估 #6.1准确率 print(f准确率{accuracy_score(y_test,y_pre)})#真实值预测值 #6.2精确率 print(f精确率{precision_score(y_test,y_pre)})#真实值预测值 #6.3召回率 print(f召回率{recall_score(y_test,y_pre)})#真实值预测值 #6.4F1值 print(fF1值{f1_score(y_test,y_pre)})#真实值预测值 #6.5roc曲线 print(froc曲线{roc_auc_score(y_test,y_pre)})#真实值预测值 #6.6分类评估报告 #参数macro avg意思是宏平均是指所有的分类器都按照macro的方式计算平均值 #不考虑样本的权重直接平均跟样本的数量、权重无关所有特征权重都一样适合于数据集比较平衡的情况 #参数weighted avg意思是加权平均是指所有的分类器都按照weighted的方式计算平均值 #考虑样本的权重根据样本的数量计算出样本的权重再进行平均适合于数据集比较不均衡的情况 print(classification_report(y_test,y_pre))#真实值预测值 #4.在main函数中测试 if __name__ __main__: # data_preprocess() # data_visualization() data_LogisticRegressionModel()
返回列表