机器学习笔记-逻辑回归

  1. 什么是逻辑回归
    参考自https://blog.csdn.net/pakko/article/details/37878837

  2. 本文通过实例来演示逻辑回归分类的作用,通过对用户性别、年龄、薪资的分析,来预测用户是否购买产品。(数据来源:https://github.com/Avik-Jain/100-Days-Of-ML-Code/blob/master/datasets/Social_Network_Ads.csv)

    data_preprocessing函数是对数据进行清洗处理。
    1.导入数据后,清洗数据,删除数据中的空格;
    2.得到标签label,并删除data中的Purchased(标签列);
    3.特征选择,该模型基于性别,年龄,薪资这三个变量,因此特征矩阵将是这三列。所以删除User ID;
    4.特征处理,对data中的性别进行编号处理,当Gender=False时,使用LabelEncoder对性别进行编号处理,当Gender=Ture时,使用自写函数map_salary对性别进行编号处理。

    data_modeling函数是对数据进行建模、模型评估。
    1.将数据分为训练集(占80%)和测试集(占20%);
    2.将逻辑回归应用于训练集。
    3.对测试集进行预测,并评估模型。本次模型评估结果是ACC、REC、f1_score、混淆矩阵、ROC_曲线

import pandas as pd
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, recall_score, f1_score, confusion_matrix, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties #显示中文

def data_preprocessing(Gender=False):
    data= pd.read_excel(r'Social_Network_Ads.xls')
    #1.清洗数据
    data = data.dropna(subset=['Gender', 'Age', 'EstimatedSalary'])#删除'Gender', 'Age', 'EstimatedSalary'的空格
    #2得到标签
    label = data['Purchased']
    data = data.drop('Purchased', axis=1)
    #3特征选择
    #该模型基于性别,年龄,薪资这三个变量,因此特征矩阵将是这三列。所以删除User ID
    data = data.drop('User ID', axis=1)
    #4特征处理
    # 对性别进行编号处理
    if Gender:
        data['Gender'] = LabelEncoder().fit_transform(data['Gender'].values)
    else:
        data['Gender'] = [map_salary(s) for s in data['Gender'].values]
    #对Age,EstimatedSalary进行最大—最小值归一化处理
    data['Age'] = MinMaxScaler().fit_transform(data['Age'].values.reshape(-1, 1))
    data['EstimatedSalary'] = MinMaxScaler().fit_transform(data['EstimatedSalary'].values.reshape(-1, 1))

    return data , label

d=dict([('Male',0),('Female',1)])
def map_salary(s):
    return d.get(s,0)

def data_modeling(features, label):
    data_train, data_test, label_train, label_test = train_test_split(features, label, test_size=0.2)
    #将逻辑回归应用于训练集
    model = LogisticRegression()
    model.fit(data_train, label_train)

    #对测试集进行预测,并评估模型
    Y_pred= model.predict(data_test)
    print('ACC:', accuracy_score(label_test, Y_pred))
    print('REC:', recall_score(label_test, Y_pred))
    print('f1_score', f1_score(label_test, Y_pred))
    print('混淆矩阵:\n', confusion_matrix(label_test, Y_pred))

    #ROC曲线
    predict_prob = model.predict_proba(data_test)
    fpr, tpr, threshold = roc_curve(label_test, predict_prob[:, 1])
    # print(threshold)
    plt.figure(figsize=(10, 10))

    font_set = FontProperties(fname=r'c:\windows\fonts\simsun.ttc', size=15)

    plt.title(u'LR_ROC_曲线', fontproperties=font_set)
    plt.plot(fpr, tpr)
    plt.savefig(r'LR_ROC_曲线.png')
    plt.show()

    # roc曲线与x轴围成的面积,即其积分(ROC曲线的AUC值),代表模型检测正例和负例的综合效果
    score = roc_auc_score(label_test, predict_prob[:, 1])
    print('ROC曲线的AUC值:', score)

    # print(len(data_train), len(data_test), len(label_train), len(label_test))

if __name__=='__main__':
    features, label = data_preprocessing(Gender=True)
    data_modeling(features, label)

运行结果:

ACC: 0.8875
REC: 0.6666666666666666
f1_score 0.7804878048780487
混淆矩阵:
 [[55  1]
 [ 8 16]]
ROC曲线的AUC值: 0.961309523809524

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值