文章目录
前言
入门机器学习,记录学习日常,如有错误请多指正。
参考书目:机器学习及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()
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
#具备中等一致性