当前位置:   article > 正文

多元 Logistic 回归的推导与 Python 实现_多元logistic回归 python

多元logistic回归 python

数学推导

导入相关包

  1. # 导入数据处理相关的包
  2. import pandas as pd
  3. import numpy as np
  4. from scipy import stats
  5. # 导入逻辑回归的包
  6. from sklearn.linear_model import LogisticRegression as LR
  7. from sklearn.preprocessing import LabelEncoder
  8. from sklearn.model_selection import train_test_split
  9. from sklearn.metrics import accuracy_score
  10. # 导入绘制循环进度条的包
  11. from tqdm import tqdm
  12. # 忽略警告
  13. import warnings
  14. warnings.filterwarnings('ignore')

导入数据

  1. # 导入数据
  2. data = pd.read_csv('letter_recognition.csv')
  3. # 划分特征和标签
  4. X = data.iloc[:,1:]
  5. y = data.iloc[:,:1]
  6. # 为字母进行编码
  7. y = LabelEncoder().fit_transform(y.values.ravel())
  8. # 划分训练集和测试集
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, shuffle=False)
  10. # 提取唯一的标签
  11. labels = np.unique(y_train)

One vs. One 算法

  1. # OvO
  2. count = 0
  3. # 将预测值初始化为 0
  4. y_pred = np.zeros((len(y_test),1))
  5. pbar = tqdm(range(len(labels)))
  6. for i in pbar:
  7. for j in range(i+1,len(labels)):
  8. # 输出进度条
  9. pbar.set_description("正在构建第{}_{}分类器".format(labels[i]+1, labels[j]+1))
  10. count += 1
  11. # 只使用属于第 i 类和第 j 类的样本训练模型
  12. y_train_ = np.where(np.logical_or(y_train==labels[i], y_train==labels[j]), y_train, np.NAN)
  13. X_train_ = X_train.iloc[~np.isnan(y_train_)]
  14. # 二元逻辑回归
  15. globals()['LR_{}_{}'.format(labels[i], labels[j])] = LR().fit(X_train_, y_train_[~np.isnan(y_train_)])
  16. # 测试集预测
  17. globals()['y_pred_{}_{}'.format(labels[i], labels[j])] = globals()['LR_{}_{}'.format(labels[i], labels[j])].predict(X_test)
  18. # 合并预测结果
  19. y_pred = np.append(y_pred, globals()['y_pred_{}_{}'.format(labels[i], labels[j])].reshape(-1,1), axis=1)
  20. print('一共构建了{}个分类器'.format(count))
  21. # 删除第一列的初始零值
  22. y_pred = np.delete(y_pred, 0, axis=1)
  23. # 以所有分类器的分类结果的众数作为最终的预测结果
  24. y_pred = np.squeeze(stats.mode(y_pred, axis=1)[0])
  25. error_rate_OvO = 1-accuracy_score(y_test, y_pred)
  26. # 查看预测结果
  27. pd.DataFrame(np.append(y_pred.reshape(-1,1), y_test.reshape(-1,1), axis=1), columns=['预测值', '真实值'], dtype=int)

One vs. Rest 算法

  1. # OvR
  2. count = 0
  3. # 将预测值初始化为 0
  4. y_pred = np.zeros((len(y_test),1))
  5. pbar = tqdm(range(len(labels)))
  6. for i in pbar:
  7. # 输出进度条
  8. pbar.set_description("正在构建第{}分类器".format(labels[i]+1))
  9. count += 1
  10. # 只使用属于第 i 类和第 j 类的样本训练模型
  11. y_train_ = np.where(y_train==labels[i], y_train, -1)
  12. # 二元逻辑回归
  13. globals()['LR_{}'.format(labels[i])] = LR().fit(X_train, y_train_)
  14. # 测试集预测
  15. globals()['y_pred_{}'.format(labels[i])] = globals()['LR_{}'.format(labels[i])].predict_proba(X_test)[:,1]
  16. # 合并预测结果
  17. y_pred = np.append(y_pred, globals()['y_pred_{}'.format(labels[i])].reshape(-1,1), axis=1)
  18. print('一共构建了{}个分类器'.format(count))
  19. # 删除第一列的初始零值
  20. y_pred = np.delete(y_pred, 0, axis=1)
  21. # 以所有分类器的分类概率的最大值对应的值作为最终的预测结果
  22. y_pred = np.argmax(y_pred, axis=1)
  23. error_rate_OvR = 1-accuracy_score(y_test, y_pred)
  24. # 查看预测结果
  25. pd.DataFrame(np.append(y_pred.reshape(-1,1), y_test.reshape(-1,1), axis=1), columns=['预测值', '真实值'], dtype=int)

直接构造多元逻辑回归模型

  1. # 直接构造多元逻辑回归模型
  2. # 多元逻辑回归
  3. LR_multiclass = LR(multi_class='multinomial').fit(X_train, y_train)
  4. # 测试集预测
  5. y_pred_multiclass = LR_multiclass.predict(X_test)
  6. error_rate_multiclass = 1-accuracy_score(y_test, y_pred_multiclass)
  7. # 查看预测结果
  8. pd.DataFrame(np.append(y_pred_multiclass.reshape(-1,1), y_test.reshape(-1,1), axis=1), columns=['预测值', '真实值'], dtype=int)

比较三种方法的误差率

  1. # 输出各方法的误差率
  2. for method in ['OvO', 'OvR', 'multiclass']:
  3. print(method+'的分类误差率{:.2%}'.format(globals()['error_rate_'+method]), sep='')

image-20220928222830418

比较三种方法的运行速度 

  • OvO 需要构造K×(K−1) / 2个二元分类器,因此耗时较长(本例耗时 16 秒),但结果也更准确。

  • OvR 需要构造K个二元分类器,因此耗时较短(本例耗时 3 秒),但结果不如 OvO 准确。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/475881
推荐阅读
相关标签
  

闽ICP备14008679号