前言
本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。
本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载
参考书目:陈强.机器学习及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 正则化有很好的支持。
- 优点: 对于大规模数据集表现良好,支持各种正则化方式。
- 适用场景: 大规模的数据集和具有稀疏特征的数据。
- lbfgs (Limited-memory Broyden-Fletcher-Goldfarb-Shanno)
- 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