> 文档中心 > 机器学习:线性模型学习总结(2):逻辑回归分类

机器学习:线性模型学习总结(2):逻辑回归分类


基于周志华老师的《机器学习》、上一篇学习笔记以及网络的其他资料,对线性模型的这一部分内容进行一个总结。上接:机器学习:线性模型学习总结(1)。
学习时间:2022.04.18

文章目录

    • 1. 用SK-Learn做逻辑回归模型
    • 2. 用SK-Learn评价回归模型
      • 2.1 简单调用Classification_report函数
      • 2.2 构建函数批量使用
    • 3. 完整代码

1. 用SK-Learn做逻辑回归模型

用于分类:sklearn.linear_model.LogisticRegression

  • penalty正则化方法:默认为“l 2 l2 l2”。
    • 有’ l 2 l2 l2’, ‘ l 1 l1 l1’, ' e l a s t i c n e t elasticnet elasticnet'三种,分别对应岭回归、Lasso回归、弹性回归。
  • l1_ratio:弹性回归参数,[0,1]。确定’l 2 l2 l2'和 'l 1 l1 l1'的比率r,仅当是“弹性网”时才使用。默认=None。
  • tol停止的容差标准:如果不是None,则在连续的epoch (loss > best_loss - tol)时停止训练。默认=1e-4。
  • C正则强度的倒数:与支持向量机一样,较小的值指定更强的正则化。default=1.0。
  • solver:用于优化问题的算法。{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}, 默认=’lbfgs’。
    • ‘newton-cg’:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    • ‘lbfgs’:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
    • ‘liblinear’:不支持设置 penalty='none';L1正则化,多用于二分类。
    • ‘sag’:要求数据进行缩放处理。支持L2正则化。随机平均梯度下降,是梯度下降法的变种。
    • ‘saga’:要求数据进行缩放处理。支持L1、L2和弹性正则化。
  • max_iter:最大迭代次数,默认=100。
  • multi_class:分类法类型,默认default=’auto’。
    • ‘auto’:自动判断。
    • ‘ovr’:每个标签都看做二分类问题。
    • ‘multinomial’:Softmax算法,多分类,即使数据是二分类的,损失最小是多项式损失拟合整个概率分布。(当solver =‘liblinear’ 时, ‘multinomial’ 不可用)。
from sklearn.model_selection import GridSearchCVfrom sklearn.linear_model import LogisticRegressionlogitReg = LogisticRegression()params = [    {'penalty': ['l2'], 'C': [0.1, 0.08, 0.12], 'solver': ['lbfgs'],     'max_iter': [1000, 2000], 'multi_class': ['auto', 'multinomial']},    {'penalty': ['l1', 'l2'], 'C': [0.1, 0.08, 0.12], 'solver': ['saga'],     'max_iter': [1000, 2000], 'multi_class': ['auto', 'multinomial']},    {'penalty': ['elasticnet'], 'l1_ratio': [0.1, 0.11, 0.12], 'C': [0.1, 0.08, 0.12], 'solver': ['saga'],     'max_iter': [1000, 2000], 'multi_class': ['auto', 'multinomial']}]  # 根据所要搜索的模型,调整需要搜索的参数scores = ['accuracy', 'f1']best_logitReg = GridSearchCV(logitReg, param_grid=params, n_jobs=-1, scoring=scores, refit='f1', error_score='raise')# 进行网格搜索best_logitReg.fit(train_x, train_y)# 将最优模型传入fare_SGDlogitReg = best_logitReg.best_estimator_logitReg.fit(train_x, train_y)train_result = logitReg.predict(train_x)

2. 用SK-Learn评价回归模型

2.1 简单调用Classification_report函数

sklearn.metrics.classification_report

可能涉及的参数:

  • y_true:1 维数组,真实数据的分类标签。
  • y_pred:1 维数组,模型预测的分类标签。
  • labels=None:列表,需要评估的标签名称。
  • target_names=None:列表,指定标签名称(有多少种分类,就要多少个标签)
  • sample_weight=None:1 维数组,不同数据点在评估结果中所占的权重。
  • digits=2:评估报告中小数点的保留位数,如果 output_dict=True,此参数不起作用,返回的数值不作处理。
  • output_dict=False:若真,评估结果以字典形式返回。
  • zero_division=‘warn’:设置在零除法时要返回的值。如果设置为“警告”,则表示为 0,但也会引发警告。
print(classification_report(y_true, y_pred, digits=6))

2.2 构建函数批量使用

还是尝试自己构建一个模板,能够批量输出相关的评价指标:

def classification_evaluation(y_true, y_pred):    # 输出准确率    accuracy = accuracy_score(y_true, y_pred)    # 得到混淆矩阵    matrix = confusion_matrix(y_true, y_pred)    # 输出精度:    precision = precision_score(y_true, y_pred)    # 输出宏平均 精确率    macro_precision = metrics.precision_score(y_true, y_pred, average='macro')    # 输出召回率:    recall = recall_score(y_true, y_pred)    # 输出宏平均 召回率    macro_recall = metrics.recall_score(y_true, y_pred, average='macro')    # fl_score    f1 = f1_score(y_true, y_pred)    # 输出宏平均 fl_score    macro_f1 = metrics.f1_score(y_true, y_pred, average='weighted')    # ROC-AUC分数    roc_auc = roc_auc_score(y_true, y_pred)

3. 完整代码

数据集用的还是Spaceship Titanic的训练集。

import pandas as pdfrom Data_processing_by_Pandas import mango_processingfrom Classification_Model_evaluation import classification_evaluationfrom Classification_Model_evaluation import plot_confusion_matrixfrom Classification_Model_evaluation import plot_curve# 读取数据train = pd.read_csv('Titanic.csv')print(train.describe())train_target = train['Transported']train_feature_before = train.drop(['PassengerId', 'Cabin', 'Name', 'Transported'], axis=1)# 进行数据处理train_feature = mango_processing(train_feature_before)# 划分训练集与测试集from sklearn.model_selection import train_test_splittrain_x, test_x, train_y, test_y = train_test_split(train_feature, train_target, test_size=0.2, random_state=42)# 引入网格搜索,找到最优模型from sklearn.model_selection import GridSearchCVfrom sklearn.linear_model import LogisticRegressionlogitReg = LogisticRegression()params = [    {'penalty': ['l2'], 'C': [0.05, 0.08, 0.03], 'solver': ['lbfgs'],     'max_iter': [1000, 800], 'multi_class': ['auto', 'multinomial']},    {'penalty': ['l1'], 'C': [0.05, 0.08, 0.03], 'solver': ['liblinear'],     'max_iter': [1000, 800], 'multi_class': ['auto']},    {'penalty': ['l2'], 'C': [0.05, 0.08, 0.03], 'solver': ['sag'],     'max_iter': [1000, 800], 'multi_class': ['auto', 'multinomial']}]  # 根据所要搜索的模型,调整需要搜索的参数scores = ['accuracy', 'f1']best_logitReg = GridSearchCV(logitReg, param_grid=params, n_jobs=-1, scoring=scores, refit='f1', error_score='raise')# 进行网格搜索best_logitReg.fit(train_x, train_y)# 得到相关参数:print(best_logitReg.best_score_)print(best_logitReg.best_params_)# 将最优模型传入模型logitReg = best_logitReg.best_estimator_# 训练模型logitReg.fit(train_x, train_y)# 模型预测train_result = logitReg.predict(train_x)# 应用自己设置的评价函数输出labels = ['False', 'True']# 训练集结果评价plot_confusion_matrix(classification_evaluation(train_y, train_result), labels)plot_curve(train_y, train_result)# 测试集结果评价test_result = logitReg.predict(test_x)plot_confusion_matrix(classification_evaluation(test_y, test_result), labels)plot_curve(test_y, test_result)