【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归


前言

本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。

本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载

参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.

数学原理等 详见陈强老师的 PPT


参考了网友阡之尘埃Python机器学习03——逻辑回归 理论上,大家都用的是Glass.csv 进行逻辑回归,结果应该都是一样的。但是,我部分结果就是不一样 o(╥﹏╥)o!!很是苦恼啊!!


一、Glass.csv

本案例使用的数据是UCI的玻璃种类(7种玻璃的类别)数据集Glass.csv。
    响应变量 Type 表示 7种玻璃的类别(但本案例样本中仅包含6种玻璃 ),包括 :
  1 建筑窗户的浮法玻璃 (building windows, float processed)
  2 建筑窗户的非浮法玻璃 (building windows, non float processed)
  3 车辆窗户的浮法玻璃 (vehicle windows, float processed)
  4 车辆窗户的非浮法玻璃 (vehicle windows, non float processed,未在样本中出现)
  5 容器 (containers) 的玻璃
  6 餐具 (tableware) 的玻璃
  7 车前灯 (headlamps)的玻璃
九个输入变量总结了玻璃数据集的属性:

  • RI refractive index 折射率
  • Na Sodium 钠含量(unit measurement: weight percent in corresponding oxide,as 4-10)
  • Mg Magnesium 镁含量
  • Al Aluminum 铝含量
  • Si Silicon 硅含量
  • K Potassium 钾含量
  • Ca Calcium 钙含量
  • Ba Barium 钡含量
  • Fe Iron 铁含量

1. 导入 数据

import pandas as pd
import numpy as np

#读取CSV文件的路径
csv_path = r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\Glass.csv'
Glass = pd.read_csv(csv_path)
Glass.shape

结果输出: (214, 10)

2. 查看 数据

1)查看数据集前 5 行

#查看数据集前 5 行
Glass.head() #默认前 5 行

在这里插入图片描述

2)响应变量Type的取值分布 (value_counts() )

Glass.Type.value_counts()

在这里插入图片描述

笔记:value_counts()

value_counts() 是 pandas 库中的一个方法,用于统计 DataFrame 或 Series 中每个唯一值的出现次数。

  • 参数:
    • normalize: 如果设置为 True,则返回相对频率而不是绝对频率。
    • sort: 默认为 True,按频率降序排列。如果设置为 False,则按索引排序。
    • ascending: 默认为 False,如果设置为 True,则按升序排列。

3)绘制 直方图(histplot)

!!在最新版本的 Seaborn 中,distplot 已被弃用。建议使用 histplot

import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(Glass.Type, kde=False) #"kde=False"不画核密度图

在这里插入图片描述

笔记:sns.histplot()

histplot 是 Seaborn 中推荐的绘制直方图的函数,可以绘制数据的频率分布,并提供多种参数进行定制。

  • 参数:
    • data:数据集,通常是 Pandas DataFrame 或 Series。
    • x:数值变量,表示要绘制直方图的数据。
    • y:可选,数值变量,表示直方图的频率或密度。
    • hue:可选,分类变量,用于按组分色。
    • bins:可选,整数或数组,指定直方图的箱数或自定义箱边界。
    • stat:可选,‘count’, ‘density’, ‘probability’, ‘frequency’,定义纵轴的统计类型。
    • kde:布尔值,是否在直方图上绘制核密度估计曲线。
    • color:可选,指定直方图的颜色。
    • palette:可选,用于分类变量的颜色调色板。
    • ax:可选,指定绘图区域或坐标轴对象。

4)绘制 箱形图(boxplot)

palette 参数的使用方式在新版本中将发生变化。在没有指定 hue 的情况下使用 palette 是不推荐的。

sns.boxplot(x='Type', y='Mg', data=Glass, hue='Type', palette='Blues', legend=False) #将 Type 作为 hue,然后禁用图例以避免重复图例

在这里插入图片描述

笔记:sns.boxplot()

sns.boxplot() 是 Seaborn 中用于绘制箱线图的函数。它可以用来展示数据的分布情况,包括中位数、四分位数及异常值。

  • 参数:
    • x:类别变量,表示箱线图的 x 轴数据。
    • y:数值变量,表示箱线图的 y 轴数据。
    • hue:可选,分类变量,用于进一步分组并为每组使用不同的颜色。
    • data:数据集,通常是 Pandas DataFrame。
    • palette:颜色调色板,指定箱线图的颜色。
    • order:列表,指定 x 轴类别的顺序。
    • orient:‘v’ 或 ‘h’,指定箱线图的方向(纵向或横向)。
    • width:箱体的宽度,默认是 0.8。
    • showfliers:布尔值,是否显示异常值(默认为 True)。
    • ax:可选,指定绘图区域或坐标轴对象
      sns.boxplot() 本身并不直接提供图例(legend)功能,但可以通过添加 hue 参数来为不同组分配颜色,并使用 Matplotlib 来显示图例。

二、处理数据

# 1. 提取 数据矩阵X与响应变量y
X = Glass.iloc[:,:-1] #选择Glass的所有行(:)和所有列,除了最后一列(:-1)。
y = Glass.iloc[:,-1] #选择Glass的所有行(:)和最后一列(-1)
# 2. 将数据 分为训练集与测试集
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
                                stratify=y,  #根据y的取值进行分层抽样
                                random_state=0) 

三、进行 多项逻辑回归

scikit-learn 中 LogisticRegression 类的 multi_class 参数 在版本 1.5 中已经被弃用,并将在版本 1.7 中移除。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(
    solver='newton-cg',         # newton-cg 是牛顿共轭梯度法的一种实现。它使用二阶导数信息(Hessian 矩阵的近似)来加速收敛。
    C=1e10,                     # 正则化强度参数
    max_iter=1000               # 最大迭代次数
)
model.fit(X_train, y_train)

print(model.n_iter_)     # 查看迭代次数
print(model.intercept_)  # 查看截距
print(model.coef_)       # 查看回归系数
print(model.score(X_test, y_test))  # 查看测试集上的准确率

结果输出:

[75] #陈强老师的结果是[205]
[-339.42107149 -302.94701206  754.3199426     3.25676146   -1.9993515
 -113.20926901]  #和陈强老师的结果不一样 o(╥﹏╥)o 
[[-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]]  #和陈强老师的结果略微不一样 o(╥﹏╥)o 
0.6461538461538462 #和陈强老师的结果一样!!!一样!!!准确率,ta,一样!!!
笔记:LogisticRegression()

LogisticRegression() 是 Scikit-learn 中用于逻辑回归的类。

  • 参数:
    • penalty: 选择正则化类型(‘l1’, ‘l2’, ‘elasticnet’, None)。默认为 ‘l2’。
    • dual: 布尔值,指示是否使用对偶问题。默认值是 False。
    • tol: 收敛标准的容忍度。默认值是 1e-4。
    • C: 正则化强度的倒数。较小的值表示较强的正则化。默认值是 1.0。
    • fit_intercept: 布尔值,指示是否计算截距。默认值是 True。
    • intercept_scaling: 仅在 fit_intercept=True 和 solver=‘liblinear’ 时有效。默认为 1。
    • class_weight: 类别权重,用于处理类别不平衡。默认为 None。
    • random_state: 控制随机数生成,确保结果的可重复性。默认为 None。
    • solver: 优化算法。可选值包括 ‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘saga’,‘auto’。默认为 ‘lbfgs’。
      • lbfgs (Limited-memory Broyden-Fletcher-Goldfarb-Shanno)
        - 描述: lbfgs 是一种拟牛顿法,用于处理大规模问题的优化。它是一种内存高效的算法,特别适用于大规模数据集高维数据
        - 优点: 适用于数据规模较大的问题,相较于完整的牛顿法需要的内存较少。
        - 适用场景: 中到大规模的数据集。
      • newton-cg
        - 描述: newton-cg 是牛顿共轭梯度法的一种实现。它使用二阶导数信息(Hessian 矩阵的近似)来加速收敛。
        - 优点: 在收敛速度上比梯度下降法更快,特别是当数据集非常大且特征空间很高时。
        - 适用场景: 中到大规模的数据集,对计算资源的要求较高。
      • liblinear
        - 描述: liblinear 是一个适用于线性分类的库,使用了坐标下降算法。它特别适合处理稀疏数据和大规模数据。
        - 优点: 对内存消耗较小,适用于较小和中等规模的数据集。
        - 适用场景: 适用于稀疏数据和较小到中等规模的数据集。
      • saga
        - 描述: saga 是一个变种的随机梯度下降(SGD)算法,能够处理大规模数据集。它对 L1 正则化和 L2 正则化有很好的支持。
        - 优点: 对于大规模数据集表现良好,支持各种正则化方式。
        - 适用场景: 大规模的数据集和具有稀疏特征的数据。
    • max_iter: 最大迭代次数。默认值是 100。
    • verbose: 控制冗长程度。默认为 0。
    • warm_start: 布尔值,指示是否重用上次调用的解决方案。默认值为 False。
    • n_jobs: 用于并行计算的作业数。默认为 None。

四、预测

1. 计算测试集中每个样例的分类概率

prob = model.predict_proba(X_test)
prob[:3]

结果输出: 和陈强老师的结果略微不一样 o(╥﹏╥)o
array([[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]])

笔记:predict_proba(X)

predict_proba(x) 是 Scikit-learn 中用于分类器的方法,返回每个类别的预测概率

  • 参数:
    • X:要预测的输入数据,通常是一个形状为 (n_samples, n_features) 的数组或数据框。
    • 返回值:一个形状为 (n_samples, n_classes) 的数组,其中每行表示一个样本的各个类别的概率。

2. 预测测试集的结果

pred = model.predict(X_test)
pred[:5]

结果输出: array([1, 3, 1, 1, 2], dtype=int64)

笔记:model.predict(X)

model.predict(X_test) 是 Scikit-learn 中用于分类器的方法,用于预测测试集的标签。该方法返回的是模型对每个样本的最终预测类别,而不是概率分布

  • 参数:
    • X:要预测的输入数据,通常是一个形状为 (n_samples, n_features) 的数组或数据框。
    • 返回值: 返回一个数组,形状为 (n_samples,),每个元素是对应样本的预测类别标签。

3. 计算测试集的混淆矩阵

from sklearn.metrics import classification_report
print(classification_report(y_test, pred))

结果输出: 和陈强老师的结果略微不一样 o(╥﹏╥)o在这里插入图片描述

4. 热力图

table = pd.crosstab(y_test, pred, rownames=['Actual'], colnames=['Predicted'])
table

import matplotlib.pyplot as plt
import seaborn as sns
sns.heatmap(table,cmap='Blues', annot=True) 
plt.tight_layout()

结果输出:
在这里插入图片描述
在这里插入图片描述

5. 计算 kappa

from sklearn.metrics import cohen_kappa_score
cohen_kappa_score(y_test, pred)

结果输出: 0.5283911671924291 比陈强老师的结果略小0.00529567


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值