[scikit-learn 机器学习] 6. 逻辑回归

文章目录

    • 1. 逻辑回归二分类
    • 2. 垃圾邮件过滤
      • 2.1 性能指标
      • 2.2 准确率
      • 2.3 精准率、召回率
      • 2.4 F1值
      • 2.5 ROC、AUC
    • 3. 网格搜索调参
    • 4. 多类别分类
    • 5. 多标签分类
      • 5.1 多标签分类性能指标

本文为 scikit-learn机器学习(第2版)学习笔记

逻辑回归常用于分类任务

1. 逻辑回归二分类

《统计学习方法》逻辑斯谛回归模型( Logistic Regression,LR)

定义:设 XXX 是连续随机变量, XXX 服从 logistic 分布是指 XXX 具有下列分布函数和密度函数:

F(x)=P(X≤x)=11+e−(x−μ)/γF(x) = P(X \leq x) = \frac{1}{1+e^{{-(x-\mu)} / \gamma}}F(x)=P(Xx)=1+e(xμ)/γ1

f(x)=F′(x)=e−(x−μ)/γγ(1+e−(x−μ)/γ)2f(x)=F'(x)= \frac {e^{{-(x-\mu)} / \gamma}}{\gamma {(1+e^{{-(x-\mu)}/\gamma})}^2}f(x)=F(x)=γ(1+e(xμ)/γ)2e(xμ)/γ

在这里插入图片描述

在逻辑回归中,当预测概率 >= 阈值,预测为正类,否则预测为负类

2. 垃圾邮件过滤

从信息中提取 TF-IDF 特征,并使用逻辑回归进行分类

import pandas as pd
data = pd.read_csv("SMSSpamCollection", delimiter='\t',header=None)
data

在这里插入图片描述

data[data[0]=='ham'][0].count() # 4825 条正常信息
data[data[0]=='spam'][0].count() # 747 条垃圾信息
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_scoreX = data[1].values
y = data[0].values
from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
y = lb.fit_transform(y)X_train_raw, X_test_raw, y_train, y_test = train_test_split(X, y, random_state=520)vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train_raw)
X_test = vectorizer.transform(X_test_raw)classifier = LogisticRegression()
classifier.fit(X_train, y_train)pred = classifier.predict(X_test)
for i, pred_i in enumerate(pred[:5]):print("预测为:%s, 信息为:%s,真实为:%s" %(pred_i,X_test_raw[i],y_test[i]))
预测为:0, 信息为:Aww that's the first time u said u missed me without asking if I missed u first. You DO love me! :),真实为:[0]
预测为:0, 信息为:Poor girl can't go one day lmao,真实为:[0]
预测为:0, 信息为:Also remember the beads don't come off. Ever.,真实为:[0]
预测为:0, 信息为:I see the letter B on my car,真实为:[0]
预测为:0, 信息为:My love ! How come it took you so long to leave for Zaher's? I got your words on ym and was happy to see them but was sad you had left. I miss you,真实为:[0]

2.1 性能指标

混淆矩阵

from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
confusion_matrix = confusion_matrix(y_test, pred)
plt.matshow(confusion_matrix)
plt.rcParams["font.sans-serif"]= 'SimHei' # 消除中文乱码
plt.title("混淆矩阵")
plt.ylabel('真实')
plt.xlabel('预测')
plt.colorbar()

在这里插入图片描述

2.2 准确率

scores = cross_val_score(classifier, X_train, y_train, cv=5)
print('Accuracies: %s' % scores)
print('Mean accuracy: %s' % np.mean(scores))
Accuracies: [0.94976077 0.95933014 0.96650718 0.95215311 0.95688623]
Mean accuracy: 0.9569274847434318

准确率不是一个很合适的性能指标,它不能区分预测错误,是正预测为负,还是负预测为正

2.3 精准率、召回率

可以参考 [Hands On ML] 3. 分类(MNIST手写数字预测)
在这里插入图片描述

单独只看精准率或者召回率是没有意义的

from sklearn.metrics import precision_score, recall_score, f1_score
precisions = precision_score(y_test, pred)
print('Precision: %s' % precisions)
recalls = recall_score(y_test, pred)
print('Recall: %s' % recalls)
Precision: 0.9852941176470589
预测为垃圾信息的基本上真的是垃圾信息Recall: 0.697916666666666630%的垃圾信息预测为了非垃圾信息

2.4 F1值

F1 值是以上精准率和召回率的均衡

f1s = f1_score(y_test, pred)
print('F1 score: %s' % f1s)
# F1 score: 0.8170731707317074

2.5 ROC、AUC

  • 好的分类器AUC面积越接近1越好,随机分类器AUC面积为0.5
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_scorefalse_positive_rate, recall, thresholds = roc_curve(y_test, pred)
roc_auc_score  = roc_auc_score(y_test, pred)plt.title('受试者工作特性')
plt.plot(false_positive_rate, recall, 'b', label='AUC = %0.2f' % roc_auc_score)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

在这里插入图片描述

3. 网格搜索调参

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, accuracy_scorepipeline = Pipeline([('vect', TfidfVectorizer(stop_words='english')),('clf', LogisticRegression())
])
parameters = {'vect__max_df': (0.25, 0.5, 0.75), # 模块name__参数name'vect__stop_words': ('english', None),'vect__max_features': (2500, 5000, None),'vect__ngram_range': ((1, 1), (1, 2)),'vect__use_idf': (True, False),'clf__penalty': ('l1', 'l2'),'clf__C': (0.01, 0.1, 1, 10),
}if __name__ == "__main__":df = pd.read_csv('./SMSSpamCollection', delimiter='\t', header=None)X = df[1].valuesy = df[0].valueslabel_encoder = LabelEncoder()y = label_encoder.fit_transform(y)X_train, X_test, y_train, y_test = train_test_split(X, y)grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, scoring='accuracy', cv=3)grid_search.fit(X_train, y_train)print('Best score: %0.3f' % grid_search.best_score_)print('Best parameters set:')best_parameters = grid_search.best_estimator_.get_params()for param_name in sorted(parameters.keys()):print('\t%s: %r' % (param_name, best_parameters[param_name]))predictions = grid_search.predict(X_test)print('Accuracy: %s' % accuracy_score(y_test, predictions))print('Precision: %s' % precision_score(y_test, predictions))print('Recall: %s' % recall_score(y_test, predictions))
Best score: 0.985
Best parameters set:clf__C: 10clf__penalty: 'l2'vect__max_df: 0.5vect__max_features: 5000vect__ngram_range: (1, 2)vect__stop_words: Nonevect__use_idf: True
Accuracy: 0.9791816223977028
Precision: 1.0
Recall: 0.8605769230769231

调整参数后,提高了召回率

4. 多类别分类

电影情绪评价预测

data = pd.read_csv("./chapter5_movie_train.csv",header=0,delimiter='\t')
data

在这里插入图片描述

data['Sentiment'].describe()
count    156060.000000
mean          2.063578
std           0.893832
min           0.000000
25%           2.000000
50%           2.000000
75%           3.000000
max           4.000000
Name: Sentiment, dtype: float64

平均都是比较中立的情绪

data["Sentiment"].value_counts()/data["Sentiment"].count()
2    0.509945
3    0.210989
1    0.174760
4    0.058990
0    0.045316
Name: Sentiment, dtype: float64

50% 的例子都是中立的情绪

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCVdf = pd.read_csv('./chapter5_movie_train.csv', header=0, delimiter='\t')
X, y = df['Phrase'], df['Sentiment'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5)pipeline = Pipeline([('vect', TfidfVectorizer(stop_words='english')),('clf', LogisticRegression())
])
parameters = {'vect__max_df': (0.25, 0.5),'vect__ngram_range': ((1, 1), (1, 2)),'vect__use_idf': (True, False),'clf__C': (0.1, 1, 10),
}grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, scoring='accuracy')
grid_search.fit(X_train, y_train)print('Best score: %0.3f' % grid_search.best_score_)
print('Best parameters set:')
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):print('\t%s: %r' % (param_name, best_parameters[param_name]))
Best score: 0.619
Best parameters set:clf__C: 10vect__max_df: 0.25vect__ngram_range: (1, 2)vect__use_idf: False
  • 性能指标
predictions = grid_search.predict(X_test)print('Accuracy: %s' % accuracy_score(y_test, predictions))
print('Confusion Matrix:')
print(confusion_matrix(y_test, predictions))
print('Classification Report:')
print(classification_report(y_test, predictions))
Accuracy: 0.6292323465333846
Confusion Matrix:
[[ 1013  1742   682   106    11][  794  5914  6275   637    49][  196  3207 32397  3686   222][   28   488  6513  8131  1299][    1    59   548  2388  1644]]
Classification Report:precision    recall  f1-score   support0       0.50      0.29      0.36      35541       0.52      0.43      0.47     136692       0.70      0.82      0.75     397083       0.54      0.49      0.52     164594       0.51      0.35      0.42      4640accuracy                           0.63     78030macro avg       0.55      0.48      0.50     78030
weighted avg       0.61      0.63      0.62     78030

5. 多标签分类

  • 一个实例可以被贴上多个 labels

问题转换:

  • 实例的标签(假设为L1,L2),转换成(L1 and L2),以此类推,缺点,产生很多种类的标签,且模型只能训练数据中包含的类,很多可能无法覆盖到
  • 对每个标签,训练一个二分类器(这个实例是L1吗,是L2吗?),缺点,忽略了标签之间的关系

5.1 多标签分类性能指标

  • 汉明损失:不正确标签的平均比例,0最好
  • 杰卡德相似系数:预测与真实标签的交集数量 / 并集数量,1最好
from sklearn.metrics import hamming_loss, jaccard_score
# help(jaccard_score)print(hamming_loss(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[0.0, 1.0], [1.0, 1.0]])))print(hamming_loss(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[1.0, 1.0], [1.0, 1.0]])))print(hamming_loss(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[1.0, 1.0], [0.0, 1.0]])))print(jaccard_score(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[0.0, 1.0], [1.0, 1.0]]),average=None))print(jaccard_score(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[1.0, 1.0], [1.0, 1.0]]),average=None))print(jaccard_score(np.array([[0.0, 1.0], [1.0, 1.0]]), np.array([[1.0, 1.0], [0.0, 1.0]]),average=None))
0.0
0.25
0.5
[1. 1.]
[0.5 1. ]
[0. 1.]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...

1.简介该部分是代码整理的第二部分,为了方便一些初学者调试代码,作者已将该部分代码打包成一个工程文件,包含简单的数据处理、xgboost配置、五折交叉训练和模型特征重要性打印四个部分。数据处理部分参考:代码整理一,这…

hive - 可优化的 10 个地方及详解

1.合理选择排序 排序算法比较耗资源,应根据业务需要选择 order by :全局排序,大数据集会消耗太过漫长的时间sort by:局部排序,只能保证每个reducer的输出数据都是有序的distribute by:分桶不排序,控制map…

[scikit-learn 机器学习] 7. 朴素贝叶斯

文章目录1. 朴素贝叶斯2. NB 与 逻辑回归对比本文为 scikit-learn机器学习(第2版)学习笔记相关知识参考:《统计学习方法》朴素贝叶斯法(Naive Bayes,NB) 1. 朴素贝叶斯 通过最大概率来预测类&#xff1a…

堕落的时候看看——清华大学老师的一席话

一双鞋,耐克的6百多;李宁的4百多;特步的3百多;361的2百多;所以,你毕业于一个什么样的大学很重要。 一双鞋,在地摊不过几十元,到了商场、专卖店,会涨到一百甚至几百。所以…

塔菲克蓝牙适配器驱动_小身材,大功能,biaze毕亚兹USB蓝牙适配器开箱体验

在日常生活中,我们平时使用的台式电脑或是笔记本电脑,想要传输数据或者音频的时候,都是需要借助数据传输线或是U盘等传输设备,使用过程可想而知,有点麻烦。我们都知道,手机是有蓝牙传输功能的,只…

MySQL - cast()函数

日常建表习惯用 create tabel tb_name as select......,这种建表方式的其中一个缺点就是:系统会根据查询出的字段,定义字段类型。有时候会把 %Y-%m-%d 格式的日期字段定义为 varchar 。建模的时候苦不堪言。 那么怎么在建表过程中自己定义每…

HDU1003——MAX SUM

简单DP&#xff0c;状态转移公式&#xff1a;num[j].data max{num[j].data, num[j].datanum[j-1].data}&#xff0c;也就是保证加上前一个数不失自己的值减小。 View Code #include <stdio.h>#define N 100010#define inf 9999999struct _num{int data;int pre;int nex…

[scikit-learn 机器学习] 8. 非线性分类和决策树

文章目录1. 特征选择标准2. 网页广告预测2.1 数量处理2.2 网格搜索模型参数3. 决策树优缺点本文为 scikit-learn机器学习&#xff08;第2版&#xff09;学习笔记相关知识&#xff1a;《统计学习方法》决策树&#xff08;Decision Tree&#xff0c;DT&#xff09; 1. 特征选择…

智慧新泰时空大数据与云平台_智慧警务大数据云平台开发情报研判系统解决方案...

智慧公安作为公安信息化开展到高级阶段的一种警务形态&#xff0c;“智慧公安”主要采用物联网、云计算、无线通讯、智能动态感知分析等新一代信息技术,将公安工作IT根底设备与物理设备、人际环境等高度交融,以提供智能化公安决策与效劳。智慧警务大数据云平台开发情报研判系统…

RGB颜色查询对照表#FFFFFF

大致是下图这样的&#xff0c;有需要的可以点击下面的连接复制使用&#xff1a; https://www.114la.com/other/rgb.htm

ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验

NuType筹资信息产品名称NuType上线平台Kickstarter发起团队NUPHY发起地区中国香港目标金额80,000HKD筹集金额1,301,212HKD完全进度1,627%支持人数1,612最低价格697HKD上线时间2019/11/13-2019/12/28创次方/制表时间&#xff1a;2019年12月28日文/大智笔电键盘的打字体验远不及桌…

英语语法之形容词从句:定语从句

形容词从句:定语从句 限制和非限制性定语从句 ----------------------------------------------------------------------------- 限制和非限制性定语从句: 限制性定语从句是名词词组不可缺少的一个组成部分,去掉了会造成病句或意义不明确; 非限制性定语从句属于补充说明性质…

MySQL - 定时任务(每天凌晨1点、每小时、每分钟、某一时间点)

常用的一定要写在前面 # 从2019-10-11开始&#xff0c;每天的00:30:00执行定时任务 ON SCHEDULE EVERY 1 DAY STARTS 2019-10-11 00:30:00 # 每天的凌晨1点执行定时任务 ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)# 特…

数据库中的null和c#中的null

再向数据库中插入数据时&#xff0c;如果插入c#中的null会报错&#xff0c;需要转换成SQl中的DBNull.Value public static object ToDbNull(object value) { if (value null || value.ToString() DateTime.MinValue.ToString()) { …

极光无限渗透测试面经_认识工业以太网及线缆测试

工业以太网由于其固有的可靠性、高性能和互操作性&#xff0c;已经渗透到工厂车间&#xff0c;成为自动化和控制系统的首选通信协议。近年&#xff0c;工业以太网的市场份额已经超过了传统的现场总线协议&#xff0c;总线协议通常需要多个独立和专有的布线设施。为了满足工业环…

mysql_根据身份证号识别性别、年龄、所在省份

1.性别&#xff1a; IF(mod(SUBSTR(c.reciver_idcard_num,17,1),2),man,woman) 性别, 2. 年龄&#xff1a; CASE WHEN c.reciver_idcard_num <> THEN (YEAR(CURDATE()) - SUBSTRING(c.reciver_idcard_num,7,4)) ELSE NULL END AS 年龄, 3. 所属省份&#xff1a; CAS…

LeetCode 286. 墙与门(BFS)

文章目录1. 题目2. 解题2.1 BFS 超时解2.2 从门开始逆向BFS1. 题目 你被给定一个 m n 的二维网格&#xff0c;网格中有以下三种可能的初始化值&#xff1a; -1 表示墙或是障碍物0 表示一扇门INF 无限表示一个空的房间。然后&#xff0c;我们用 231 - 1 2147483647 代表 INF…

法斗几个月长鼻筋_路医生说丨脚底板早起一下地特别疼?得了足底筋膜炎,该怎么办?...

老李很奇怪&#xff0c;他压根就没有受过伤&#xff0c;怎么突然就脚底板疼了起来。就是这两天走的稍多了点&#xff0c;也不知道为什么脚底板就开始疼了&#xff0c;走路踩地就疼&#xff0c;尤其是早晨起床脚一踩地&#xff0c;那酸爽简直了&#xff0c;刚下地的前几步走起来…

Power BI连接MySQL 提示错误......未能加载文件或程序集......或它的某一个依赖项

Power BI连接MySQL数据库时报错&#xff1a; 提示错误未能加载文件或程序集“MySql.Data, Version5.1.4.0, Cultureneutral,........”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 解决办法&#xff1a;下载MySQL.Data.dll(5.1.4)程序集&#xff01; 解压…

LeetCode 346. 数据流中的移动平均值(队列)

文章目录1. 题目2. 解题1. 题目 给定一个整数数据流和一个窗口大小&#xff0c;根据该滑动窗口的大小&#xff0c;计算其所有整数的移动平均值。 示例: MovingAverage m new MovingAverage(3); m.next(1) 1 m.next(10) (1 10) / 2 m.next(3) (1 10 3) / 3 m.next(5) …