陈强-机器学习及Python应用-6.4 多项逻辑回归案例


前言

入门机器学习,记录学习日常,如有错误请多指正。
参考书目:机器学习及Python应用
参考了赛博机器喵【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归

一、数据处理

1.导入模块和数据文件

案例采用Glass数据。响应变量Type包含7种玻璃类别,特征变量包括RI(折射率)以及8种不同元素在相应氧化物中的重量占比:Na,Mg,Al,Si,K,Ca,Ba与Fe。

导入所需模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_score

载入Glass.csv文件,考察其形状

Glass=pd.read_csv('D:\数据集\\MLPython_Data\\Glass.csv')
print(Glass.shape)#考察形状
(214, 10)#数据库包含214个观测值和10个变量

展示数据框前五行观测值

print(Glass.head())
        RI     Na    Mg    Al     Si     K    Ca   Ba   Fe  Type
0  1.52101  13.64  4.49  1.10  71.78  0.06  8.75  0.0  0.0     1
1  1.51761  13.89  3.60  1.36  72.73  0.48  7.83  0.0  0.0     1
2  1.51618  13.53  3.55  1.54  72.99  0.39  7.78  0.0  0.0     1
3  1.51766  13.21  3.69  1.29  72.61  0.57  8.22  0.0  0.0     1
4  1.51742  13.27  3.62  1.24  73.08  0.55  8.07  0.0  0.0     1

考察响应变量Type的取值分布:

print(Glass.Type.value_counts())
Type
2    76
1    70
7    29
3    17
5    13
6     9

2.数据可视化

生成柱状图

sns.displot(Glass.Type,kde=False)
#根据玻璃类型生成柱状图,kde=False表示不画核密度图(仅对连续变量有意义)
plt.show()

玻璃种类柱状图
生成箱型图,考察特征变量与响应变量的关系

sns.boxplot(x='Type',y='Mg',data=Glass,hue='Type',palette='Blues')
#hue='Type'表示根据'Type'分类,palette='Blues'表示使用蓝色调色板
plt.show()

变量Mg的箱形图

3.对数据进行抽样

从数据框Glass中提取数据矩阵X与响应变量y

X=Glass.iloc[:,:-1]
y=Glass.iloc[:,-1]

将数据矩阵X与响应变量y随机分为训练集与测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,stratify=y,random_state=0)
#stratify=y表示根据响应变量y进行分层抽样

二、进行多项逻辑回归

1.使用sklearn模块的LogisticRegression类进行回归

model=LogisticRegression(solver='newton-cg',C=1e10,max_iter=1000)
#solver='newton-cg'表示使用Newton-CG算法进行迭代求解
#C=1e10
model.fit(X_train,y_train)

2.考察相应指标

print(model.n_iter_)#迭代次数
print(model.intercept_)#截距项
print(model.coef_)#回归系数

结果如下:

[75]#迭代次数

[-339.42107149 -302.94701206  754.3199426     3.25676146   -1.9993515
 -113.20926901]
 #以上为截距项
 
[[-1.20095546e+02  3.36008111e+00  1.20117878e+01 -9.93118318e+00
   5.53432810e+00  6.58299542e+00  7.09470497e+00  2.23851230e+01
   6.09956523e+01]
 [ 2.51953155e+02 -2.12274165e+00  4.45827350e+00 -1.23745825e+01
  -5.19906290e-01  4.24725795e-01  5.35134443e-01  3.34244179e+01
   6.34707009e+01]
 [-1.15741933e+03  1.11388676e+01  1.76898612e+01 -3.80806942e+00
   9.48319163e+00  1.14789584e+01  1.39563801e+01  5.10356214e+01
   5.67990722e+01]
 [ 7.25892546e-02 -1.85485818e+01 -1.90235400e+01  5.56926550e+01
   2.71586028e+00  3.79381044e+00 -1.75603394e+00 -1.26265768e+02
   1.10390829e+02]
 [-5.67252328e+00  1.47268040e+01  4.10662010e-01 -6.68696509e-01
  -2.32019080e+00 -3.14197049e+01 -1.32112176e+00 -2.43384557e+01
  -1.24455004e+02]
 [ 1.03116166e+03 -8.55442932e+00 -1.55470446e+01 -2.89101233e+01
  -1.48932829e+01  9.13921483e+00 -1.85090638e+01  4.37590618e+01
  -1.67201250e+02]]
  #以上为回归系数
 

三.预测

1.计算测试集预测准确率

print(model.score(X_test,y_test))
0.6461538461538462

2.计算测试集的分类概率和预测结果

y_prob=model.predict_proba(X_test)#测试集每个样例的分类概率
y_pred=model.predict(X_test)#预测测试集每个样例的类型
print(y_prob[:5])#预测概率前5行
print(y_pred[:5])#预测结果前5个观测值
[[6.79178189e-01 2.42571766e-01 7.80207513e-02 7.16996600e-37
  5.26015940e-14 2.29294492e-04]
 [3.06102701e-01 3.42997906e-01 3.50823330e-01 1.12255411e-24
  2.91470106e-12 7.60629446e-05]
 [5.66113023e-01 2.53409320e-01 1.79816316e-01 4.49581927e-23
  1.06478197e-16 6.61341318e-04]
 [7.48985740e-01 1.39181015e-01 1.11832053e-01 1.64767926e-27
  6.20493067e-19 1.19176777e-06]
 [2.11253582e-04 9.86899528e-01 1.28892185e-02 2.79399396e-25
  2.48805898e-28 2.96470183e-15]]
  #预测概率前5行
[1 3 1 1 2]#预测结果前5个观测值

3.测试集混淆矩阵

使用sklearn的confusion_matrix()函数计算

table=confusion_matrix(y_test,y_pred)
print(table)
[[15  3  3  0  0  0]
 [ 6 13  1  1  0  2]
 [ 1  2  2  0  0  0]
 [ 0  0  0  3  0  1]
 [ 0  1  0  1  1  0]
 [ 0  0  0  1  0  8]]

使用pandas的crosstab()函数计算

table=pd.crosstab(y_test,y_pred,rownames=['Actual'],colnames=['Predicted'])
print(table)
Predicted   1   2  3  5  6  7
Actual                       
1          15   3  3  0  0  0
2           6  13  1  1  0  2
3           1   2  2  0  0  0
5           0   0  0  3  0  1
6           0   1  0  1  1  0
7           0   0  0  1  0  8

使用seaborn的heatmap()函数画出混淆矩阵热图

sns.heatmap(table,cmap='Blues',annot=True)#annot表示每个方格都加上注释
plt.tight_layout#自动调整子图布局
plt.show()

在这里插入图片描述

4. 预测效果指标

使用sklearn的classification_report()函数,获得详细的预测效果指标

print(classification_report(y_test,y_pred))
              precision    recall  f1-score   support

           1       0.68      0.71      0.70        21
           2       0.68      0.57      0.62        23
           3       0.33      0.40      0.36         5
           5       0.50      0.75      0.60         4
           6       1.00      0.33      0.50         3
           7       0.73      0.89      0.80         9

    accuracy                           0.65        65
   macro avg       0.65      0.61      0.60        65
weighted avg       0.67      0.65      0.64        65

计算kappa指标

print(cohen_kappa_score(y_test,y_pred))
0.5283911671924291
#具备中等一致性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值