-
什么是逻辑回归
参考自https://blog.csdn.net/pakko/article/details/37878837 -
本文通过实例来演示逻辑回归分类的作用,通过对用户性别、年龄、薪资的分析,来预测用户是否购买产品。(数据来源: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