逻辑回归简介
原理:把(线性回归处理后的)值->通过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.加载数据 data=pd.read_csv('./datas/breast-cancer-wisconsin.csv') data.info()#查看数据信息 # 2.数据预处理 #2.1把?替换成np.nan,参1:要被替换的值,参2:用来替换的值 参3:是否替换源数据,默认为False data.replace('?',np.nan,inplace=True) #2.2缺失值处理->删除 原本有699个数据,但有16个?脏数据,所以删除后,剩683个数据 data.dropna(axis=0,inplace=True)#axis=0表示行,删除包含缺失值的行 #2.3打印处理后的信息 data.info() # 3特征工程(特征提取,特征预处理,特征降维,特征选择,特征组合 #3.1特征提取之提取特征和标签 x=data.iloc[:,1:-1]#按照行号,列索引获取数据,:表示所有行,1:-1表示从第1列到最后1列,包左不包右 y=data.iloc[:,-1]#获取最后一列 # y=data.iloc['Class']#获取最后一列,效果同上 # y=data.Class#获取最后一列,效果同上 #3.2查看下特征和标签 print(x[:5]) print(y[:5]) print(x.shape,y.shape) #3.3切割训练集和测试集 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=23) #3.4特征工程:标准化 #3.4.1创建标准化对象 transfer=StandardScaler() #3.4.2对训练集进行标准化 训练+标准化 x_train=transfer.fit_transform(x_train) #3.4.3对测试集进行标准化 标准化 x_test=transfer.transform(x_test) # 4.模型训练 #4.1创建模型对象->逻辑回归模型 estimator=LogisticRegression() #4.2模型训练 estimator.fit(x_train,y_train) # 5.模型预测 y_pre=estimator.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/(tp+fp) 3.召回率=真正例在真正例中的占比;tp/(tp+fn) 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_A=confusion_matrix(y_train,y_pre_A) print(f'混淆矩阵A:{cm_A}') #6.为了测试结果更好看,把上述的混淆矩阵转换成DataFrame df_A=pd.DataFrame(cm_A,index=df_lable,columns=df_lable) print(f'混淆矩阵A的DataFrame对象形式:\n{df_A}') #7.针对于真实值(y_train)和模型B预测结果(y_pre_B),搭建混淆矩阵 cm_B=confusion_matrix(y_train,y_pre_B) print(f'混淆矩阵A:{cm_B}') #8.为了测试结果更好看,把上述的混淆矩阵转换成DataFrame df_B=pd.DataFrame(cm_B,index=df_lable,columns=df_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.读取数据 data=pd.read_csv('./datas/churn.csv') data.info() print(data.head(5))#原来的字符串列是Churn和gender #2.因为上述的Churn,gender是字符串类型的,我们要对其进行热编码(one-hot)处理 data=pd.get_dummies(data) data.info() print(data.head(5))#热编码后的结果:将上面的两列换成了4列:Churn_No,Churn_Yes,gender_Male,gender_Female;这是bool类型 #但是上面4列太冗余了,我们可以删除其中的一列 #3.删除列 参数1:要删除的列名 参数2:删除的是列 参数3:是否在原数据上进行修改 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) data.info() print(data.head(5)) #4.修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) data.info() print(data.head(5)) #5.查看一下数据集中,标签是否是均衡的 print(data['flag'].value_counts())#False:不流失,True:流失 #2.定义函数,用于数据的可视化,显示:月度会员的流失情况 def data_visualization(): #1.读取数据 data=pd.read_csv('./datas/churn.csv') #2.对上述数据做热编码处理 data=pd.get_dummies(data) #3.删除冗余列 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) #4.修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) #5.查看数据集的分布情况 print(data.flag.value_counts()) print(data.columns)#查看数据集的列名 #6.通过技术柱状图,绘制(月度会员的流失情况) sns.countplot(data,x='Contract_Month',huez ='flag') plt.show() #3.定义函数,用于实现逻辑回归模型的训练与评估 def data_LogisticRegressionModel(): #1.读取数据 data=pd.read_csv('./datas/churn.csv') #2.数据预处理 #2.1对上述数据做热编码处理 data=pd.get_dummies(data) #2.2删除冗余列 data.drop(['Churn_No','gender_Male'],axis=1,inplace=True) #2.3修改列名,将Churn_Yes定义为标签列flag data.rename(columns={'Churn_Yes':'flag'},inplace=True) #3.特征工程(特征提取,特征预处理:标准还、归一化...)这里不用 #划分数据集为训练集和测试集 x=data[['Contract_Month','PaymentElectronic','internet_other']] y=data[['flag']] x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42) #4.创建逻辑回归模型并训练 #4.1创建逻辑回归对象 estimator=LogisticRegression() #4.2训练模型 estimator.fit(x_train,y_train) #5.模型预测 y_pre=estimator.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(f'F1值:{f1_score(y_test,y_pre)}')#真实值,预测值 #6.5roc曲线 print(f'roc曲线:{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()