【机器学习】逻辑回归
0. 数学基础sigmoid函数极大似然估计极大似然估计Maximum Likelihood Estimation, MLE是一种统计方法用于根据已观测到的数据估计模型参数。它的基本思想是找到一组参数使得在这些参数下观测到的数据出现的概率最大。什么是极大似然估计https://ai123.blog.csdn.net/article/details/144034431?fromshareblogdetailsharetypeblogdetailsharerId144034431sharereferPCsharesourceI_Like_S_sharefromfrom_link1. 简介逻辑回归Logistic Regression一种分类模型输出是 (0, 1) 之间的值。基本思想把经过处理预测出的值通过sigmoid激活函数映射到 (0, 1) 之间结合阈值划分正负样本。特点监督学习、有特征、有标签且标签是离散的应用场景适用于二分类。损失函数其中是逻辑回归预估的类别0或1。损失函数的手工计算Loss -[1*0.4(1-1)*(1-0.4) # 第一个特征的损失0*0.68(1-0)*(1-0.68) # 第二个特征的损失1*0.41(1-1)*(1-0.41) # 第三个特征的损失...] # 以此类推工作原理每个样本预测值有A、B两个类别真实类别对应的位置概率值越大越好。2. API函数sklearn. linear_model. LogisticRegression(solver liblinear, penalty 12, C 1.0)solver 损失函数优化方法:liblinear 对小数据集场景训练速度更快sag 和 saga 对大数据集更快一些。正则化:liblinear支持L1 正则化sag支持L2正则化或者没有正则化saga支持L1 正则化、支持L2正则化或者没有正则化。penalty:正则化的种类11 或者 12C:正则化力度默认将类别数量少的当做正例案例癌症分类预测数据描述1699条样本共11列数据第一列用语检索的id后9列分别是与肿瘤相关的医学特征最后一列表示肿瘤类型的数值。2包含16个缺失值用 “?” 标出。32表示良性4表示恶性。代码实现# 癌症预测 # 导包 import numpy as np import pandas as pd from scipy.linalg.interpolative import estimate_rank 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 # 加载数据 data pd.read_csv(E:/数据分析材料/breast-cancer-wisconsin.csv) print(data.info()) # 数据预处理 # 因为里面有? 需要将其替换成np.nan # 参1要被替换的值参2替换成的值参3是否替换源数据 data.replace(?,np.nan,inplaceTrue) # 缺失值处理 ——删除缺失行 data.dropna(axis0,inplaceTrue) # 特征工程 # 获取列名 print(data.columns) # 不要第一列 Sample code number x data.iloc[:, 1:-1] # 获得特征 y data.iloc[:, -1] # 获得标签 # 切割 训练接 和 测试集 x_train, x_test, y_train, y_test train_test_split(x,y,test_size0.2,random_state22) # 标准化 transfer StandardScaler() x_train transfer.fit_transform(x_train) x_test transfer.transform(x_test) # 模型训练 estimator LogisticRegression() estimator.fit(x_train,y_train) # 模型预测 y_pred estimator.predict(x_test) # 模型评估 # 正确率,公式预测对的/样本总数 print(f预测前评估正确率{estimator.score(x_test,y_test)}) print(f预测后评估正确率{accuracy_score(y_test,y_pred)})运行结果思考逻辑回归模型能用 准确率 来评测吗答案可以但是结果不精准因为逻辑回归模型主要用于 二分类即A类还是B类不能说 97%的A类3%的B类。所以要通过混淆矩阵来评测即:精确率召回率F1值(F1-Score)ROC曲线AUC值.3. 分类问题评估3.1. 混淆矩阵真实值是正例的样本中被分类为正例的样本数量有多少叫做真正例(TPTrue Positive)真实值是正例的样本中被分类为假例的样本数量有多少叫做伪反例(FNFalse Negative)真实值是假例的样本中被分类为正例 的样本数量有多少叫做伪正例(FPFalse Positive)真实值是假例的样本中被分类为假例的样本数量有多少叫做真反例(TNTrue Negative)精确率Precision查准率正例样本的预测准确率。召回率Recall查全率指的是预测为真正例样本占所有真实正例样本的比重。F1-score模型的综合预测能力。上诉指标的代码示例3.2背景已知有10个样本6个恶性肿瘤(正例)4个良性肿瘤(反例).模型A预测结果为:预测对了3个恶性肿瘤预测对了4个良性肿瘤模型B预测结果为:预测对了6个恶性肿瘤预测对了2个良性肿瘤# 导包 import pandas as pd from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score # 1、定义变量记录样本数据真实值 y_train[恶性,恶性,恶性,恶性,恶性,恶性,良性,良性,良性,良性] # 2、定义变量记录模型A的预测结果 y_pred_A[恶性,恶性,恶性,良性,良性,良性,良性,良性,良性,良性] # 3、定义变量记录模型B的预测结果 y_pred_B[恶性,恶性,恶性,恶性,恶性,恶性,良性,恶性,恶性,恶性] # 4、用标签标记正例、反例 label [恶性, 良性] df_label [恶性(正例), 良性(反例)] # 5、搭建混淆矩阵 cm_A confusion_matrix(y_train,y_pred_A,labelslabel) print(f混淆矩阵A\n {cm_A}) # 为了测试结果更好看将上述混淆矩阵转成DataFrame df_A pd.DataFrame(cm_A,indexdf_label,columnsdf_label) print(f混淆矩阵A的DataFrame对象形式\n {df_A}) print(---------------------------------------------) cm_B confusion_matrix(y_train,y_pred_B,labelslabel) print(f混淆矩阵B\n {cm_B}) # 为了测试结果更好看将上述混淆矩阵转成DataFrame df_B pd.DataFrame(cm_B,indexdf_label,columnsdf_label) print(f混淆矩阵B的DataFrame对象形式\n {df_B}) print(---------------------------------------------) # 6、计算A模型的精确率召回率F1值 print(f模型A的精确率{precision_score(y_train,y_pred_A,pos_label恶性)}) print(f模型A的召回率{recall_score(y_train,y_pred_A,pos_label恶性)}) print(f模型A的F1值{f1_score(y_train,y_pred_A,pos_label恶性)}) # 7、计算B模型的精确率召回率F1值 print(f模型B的精确率{precision_score(y_train,y_pred_B,pos_label恶性)}) print(f模型B的召回率{recall_score(y_train,y_pred_B,pos_label恶性)}) print(f模型B的F1值{f1_score(y_train,y_pred_B,pos_label恶性)})3.2. AUC指标和ROC曲线真正率TPR和假正率FPRTPR(True Positive Rate)正样本中被预测为正样本的概率。FPR(False Positive Rate)负样本中被预测为正样本的概率。ROC曲线Receiver Operating Characteristic curveROC曲线是一种常用于评估分类模型性能的可视化工具。ROC曲线以模型的真正率TPR为纵轴假正率FPR为横轴它将模型在不同阈值下的表现以曲线的形式展现出来。点坐标说明图像 x 轴 FPR / y 轴 TPR任意一点坐标 A ( FPR值, TPR值 )1. 点(0, 0)所有的负样本都预测正确所有的正样本都预测为错误。相当于点的(FPR值 0, TPR值 0)2. 点(1, 0)所有的负样本都预测错误所有的正样本都预测错误。相当于点的(FPR值1TPR值0).最不好的效果.3. 点(1, 1)所有的负样本都预测错误表示所有的正样本都预测正确。相当于点的(FPR值1TPR值1)4. 点(0, 1)所有的负样本都预测正确表示所有的正样本都预测正确。相当于点的(FPR值0TPR值1).最好的效果。ROC曲线的绘制背景在网页某个位置有一个广告图片该广告共被展示了6次有2次被浏览者点击了。每次点击的概率见图1其中正样本(13} 负样本为(2456}要求画出在不同阈值下的ROC曲线。大于阈值被判为正例小于等于阈值被判为反例。阈值0.9原本为正例的1、3号的样本全部被分类错误则TPR0/20原本为负例的2、4、5、6号样本没有一个被分为正例则FPR0。所以得到坐标 ( 0, 0 ).阈值0.8原本为正例的1、3号样本中1号被分类正确则TPR1/20.5原本为负例的2、4、5、6号样本没有一个被分为正例则FPR0。所以得到坐标 ( 0, 0.5 ).阈值0.7原本为正例的1、3号样本全部被分类正确则TPR 2/21原本为负例的2、4、5、6号样本没有一个被分为正例则FPR 0/40。所以得到坐标 ( 0, 1 ).阈值0.6原本为正例的1、3号样本全部被分类正确则 TPR2/21原本为负类的2、4、5、6 号样本中2号样本被分类错误则FPR1/4 0.25。所以得到坐标 ( 0.25, 1 ).阈值0.5原本为正例的1、3号样本全部被分类正确则TPR2/21原本为负类的2、4、5、6号样本中2、4号样本被分类错误则FPR2/4 0.5。所以得到坐标 ( 0.5, 1 ).阈值0.4原本为正例的1、3号样本全部被分类正确则TPR2/21原本为负类的2、4、5、6号样本中2、4、5全部被分类错误则FPR3/40.75。( 0.75, 1 ).阈值0.3/0.2/0.1原本为正例的1、3号样本全部被分类正确则TPR2/21原本为负类的2、4、5、6号样本全部被分类错误则FPR4/41。( 1, 1 ).最后得到的ROC曲线为AUCArea Under the ROC Curve曲线下面积ROC曲线的优劣可以通过曲线下的面积(AUC)来衡量AUC越大表示分类器性能越好。当AUC0.5时表示分类器的性能等同于随机猜测。当AUC1时表示分类器的性能完美能够完全正确地将正负例分类。4. 电信客户流失预测案例已知用户个人通话上网等信息数据需求通过分析特征属性确定用户流失的原因以及哪些因素可能导致用户流失。建立预测模型来判断用户是否流失并提出用户流失预警策略。4.0. 导包4.1. 数据预处理# 定义函数数据预处理 def data_preprocess(): # 读取数据 data pd.read_csv(E:/数据分析材料/churn.csv) # 显示数据信息 print(data.info()) # 因为数据中 Churn 和 gender 列是字符串所以需要进行one-hot编码处理 data pd.get_dummies(data,columns[Churn,gender]) # 处理后的数据 print(data.info()) # 删除one-hot处理后冗余的列 # 参1要删的列 参2axis1表示删除列 参3直接修改源数据 data.drop([Churn_No,gender_Male],axis1,inplaceTrue) # 修改列名Churn_Yes作为标签列 data.rename(columns{Churn_Yes:flag},inplaceTrue) # 查看数据值的分布 false--不流失 True--流失 print(data.flag.value_counts()) # False:5174 True:1869 # 测试 if __name__ __main__: data_preprocess()原始数据信息经过one-hot编码后的数据信息4.2. 数据的可视化# 定义函数数据可视化 def data_visualization(): # 前面和上面的数据预处理步骤一样 data pd.read_csv(E:/数据分析材料/churn.csv) data pd.get_dummies(data,columns[Churn,gender]) data.drop([Churn_No,gender_Male],axis1,inplaceTrue) data.rename(columns{Churn_Yes:flag},inplaceTrue) # 查看列名 print(data.columns) # 数据的可视化 绘制计数柱状图 # 看是否订阅月度会员 与 用户流失之间的关系 # 参1数据集 参2x轴的列名 参3hue分组的字段 sns.countplot(datadata,xContract_Month,hueflag) plt.show() # 测试 if __name__ __main__: # data_preprocess() data_visualization()绘制出的结果4.3 模型的训练、预测与评估# 定义函数逻辑回归算法的模型训练预测评估 def model_train_test(): data pd.read_csv(E:/数据分析材料/churn.csv) data pd.get_dummies(data,columns[Churn,gender]) data.drop([Churn_No,gender_Male],axis1,inplaceTrue) data.rename(columns{Churn_Yes:flag},inplaceTrue) print(data.info()) print(data.columns) # 选取特征 x data[[internet_other,Contract_Month,PaymentBank]] y data[flag] # 分割训练集和测试集 x_train,x_test,y_train,y_test train_test_split(x,y,test_size0.2,random_state23) # 特征预处理这里不需要 # 模型训练 estimator LogisticRegression() estimator.fit(x_train,y_train) # 模型预测 y_pred estimator.predict(x_test) # 模型评估 print(f精确率{precision_score(y_test,y_pred)}) print(f召回率{recall_score(y_test, y_pred)}) print(ff1值{f1_score(y_test, y_pred)}) print(f分类评估报告{classification_report(y_test, y_pred)}) # 测试 if __name__ __main__: # data_preprocess() # data_visualization() model_train_test()运行结果结果不是很好...分类评估报告中macro avg宏平均即对每个类别的指标精确率、召回率、F1简单算术平均每个类别权重相同不考虑类别不平衡。适用于数据均衡情况。weighted avg对每个类别的指标按该类别的支持度样本数进行加权平均考虑类别不平衡。适用于数据不均衡情况。