机器学习——逻辑回归

逻辑回归

机器学习中的一种分类模型,是一种分类算法,解决二分类问题的利器

在这里插入图片描述
逻辑回归的输入是线性回归的输出

激活函数

sigmoid函数
把整体回归的内容映射到0-1区间
在这里插入图片描述
在这里插入图片描述

损失及优化

损失(对数似然损失)

y是真实值
在这里插入图片描述
当y=1时,我们希望hθ(x)越大越好
当y=0时,我们希望hθ(x)越小越好

完整损失函数
在这里插入图片描述

优化

梯度下降法
提升原本属于1类别的概率,降低原本是0类别的概率

sklearn.linear_model.LogisticRegression(solver='liblinear',penalty='l2',c=1.0)
在这里插入图片描述

癌症分类预测-良/恶性乳腺癌肿瘤预测

#1获取数据
import pandas as pd
names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
                   'Normal Nucleoli', 'Mitoses', 'Class']

data=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names=names)
data.head()

在这里插入图片描述

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

#2基本数据处理
#2.1缺失值处理
data=data.replace(to_replace='?',value=np.NaN)
data=data.dropna()

#2.1确定特征值,目标值
x=data.iloc[:,1:-1]
y=data['Class']

#2.3分割数据
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=22,test_size=0.2)

#3特征工程(标准化)
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.fit_transform(x_test)

#4机器学习(逻辑回归)
estimator=LogisticRegression()
estimator.fit(x_train,y_train)

#5模型评估
#5.1准确率
ret=estimator.score(x_test,y_test)
print('准确率为:\n',ret)

#5.2预测值
y_pre=estimator.predict(x_test)
print('预测值为:\n',y_pre)

准确率为:
0.9854014598540146
预测值为:
[2 4 4 2 2 2 2 2 2 2 2 2 2 4 2 2 4 4 4 2 4 2 4 4 4 2 4 2 2 2 2 2 4 2 2 2 4
2 2 2 2 4 2 4 4 4 4 2 4 4 2 2 2 2 2 4 2 2 2 2 4 4 4 4 2 4 2 2 4 2 2 2 2 4
2 2 2 2 2 2 4 4 4 2 4 4 4 4 2 2 2 4 2 4 2 2 2 2 2 2 4 2 2 4 2 2 4 2 4 4 2
2 2 2 4 2 2 2 2 2 2 4 2 4 2 2 2 4 2 4 2 2 2 4 2 2 2]

分类评估方法

混淆矩阵

在分类任务下,由预测结果和真实结果之间存在的四种不同组合构成
在这里插入图片描述

准确率 (对不对)
预测与真实一样所占的比例
(TP+TN)/(TP+FN+FP+TN)

精确率(查的准不准)
预测结果为正例样本中真实为正例的比例
(TP)/(TP+FP)

召回率(查的全不全)
真实值为正例的样本中预测结果为正例的比例
(TP)/(TP+FN)

F1-score
用来反映模型的稳健性
在这里插入图片描述

分类评估报告api
sklearn.metrics.classification_report(y_true,y_pred,labels=[],target_names=None)
labels是指定类别对应的数字,target_name是目标类别名称

from sklearn.metrics import classification_report

#5.3精确率/召回率指标评价
ret=classification_report(y_test,y_pre,labels=(2,4),target_names=('良性','恶性'))
print(ret)

在这里插入图片描述

ROC曲线和AUC指标
样本不均衡(类别不平衡)
比例大于4比1就认为是样本不均衡,此时就不能用精确率,召回率来评价指标,而用ROC曲线和AUC指标来评价

TPR(召回率)与FPR
在这里插入图片描述

在这里插入图片描述
AUC的概率意义是随机取一对正负样本,正样本得分大于负样本得分的概率
AUC的范围在[0,1]之间 ,并且越接近1越好,越接近0.5属于乱猜
AUC只能用来评价二分类

sklearn.metrics.roc_auc_score(y_true,y_score)

from sklearn.metrics import roc_auc_score

#5.4auc指标计算
y_test=np.where(y_test>3,1,0) #把y_test大于3的置1,否则置0
roc_auc_score(y_test,y_pre)

y_score是预测得分

ROC曲线的绘制

假设有6次展示记录,有2次被点击了
展示序列(1:1,2:0,3:1,4:0,5:0,6:0),前面表示序号,后面1表示点击0表示没有点击
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
ROC曲线积分与AUC相等

类别不平衡数据

过采样方法:增加数量较少那一类样本的数量,使得正负样本比例均匀
欠采样方法:减少数量较多那一类样本的数量,使得正负样本比例均匀

准备不平衡数据

from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
from collections import Counter
X,y = make_classification(n_samples=5000, n_features=2, 
                          n_informative=2, n_redundant=0, 
                          n_repeated=0, n_classes=3, 
                          n_clusters_per_class=1, #某一个类别是由几个cluster构成
                          weights=[0.01, 0.05, 0.94], random_state=0)
Counter(y)

Counter({2: 4674, 1: 262, 0: 64})

数据可视化

plt.scatter(X[:, 0], X[:, 1], c=y) #c=y代表基于y来分不同类别
plt.show()

在这里插入图片描述
过采样
随机过采样
在少数类中随机选择一些样本,然后通过复制所选择的样本生成样本集
缺点:造成模型训练复杂度加大,造成模型过拟合问题

from imblearn.over_sampling import RandomOverSampler
ros = RandomOverSampler(random_state=0)
X_resampled, y_resampled = ros.fit_resample(X, y)
Counter(y_resampled)

Counter({2: 4674, 1: 4674, 0: 4674})

# 数据可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()

在这里插入图片描述

SMOTE过采样
对每个少数类样本,从它的最近邻中随机选择一个样本(是少数类中的一个样本),然后在其之间的连线上随机选择一点作为新合成的少数类样本

from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = SMOTE().fit_resample(X, y)
Counter(y_resampled)

Counter({2: 4674, 1: 4674, 0: 4674})

# 数据可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()

在这里插入图片描述
欠采样
随机欠采样
在多数类中随机选择一些样本,然后将样本集移除
缺点:会造成一些信息缺失

from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(X, y)
Counter(y_resampled)

Counter({0: 64, 1: 64, 2: 64})

# 数据可视化
plt.scatter(X_resampled[:, 0], X_resampled[:, 1], c=y_resampled)
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
居民出行选择行为可以被视为一个分类问题,其中特征包括年龄、性别、收入、出行目的、出行时间、出行距离等。在这里,我们可以使用逻辑回归模型进行预测。 我们可以先收集一些相关数据,然后将其分为训练集和测试集。接着,我们可以使用 Python 中的 Scikit-learn 库来构建逻辑回归模型。具体步骤如下: 1. 首先,我们需要导入所需的库: ```python import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 2. 然后,我们需要加载数据并进行预处理: ```python data = pd.read_csv('travel_behavior.csv') data = data.dropna() # 删除缺失值 data = pd.get_dummies(data, columns=['purpose', 'time']) # 将分类变量转换为哑变量 X = data.drop(['choice'], axis=1) y = data['choice'] ``` 这里,我们使用了 Pandas 库加载数据,并删除了任何包含缺失值的行。然后,我们使用 `get_dummies()` 函数将分类变量转换为哑变量。最后,我们将特征(`X`)和标签(`y`)分开。 3. 接着,我们将数据分为训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) ``` 这里,我们使用了 `train_test_split()` 函数来将数据分为训练集和测试集。我们选择了 20% 的数据作为测试集,而其余的数据则用于训练模型。 4. 然后,我们可以使用逻辑回归模型进行训练: ```python model = LogisticRegression() model.fit(X_train, y_train) ``` 这里,我们使用了 Scikit-learn 库中的 `LogisticRegression()` 类来构建逻辑回归模型,并使用 `fit()` 方法将模型拟合到训练数据上。 5. 最后,我们可以使用测试集来评估模型的准确性: ```python y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 这里,我们使用 `predict()` 方法来预测测试集中的标签,并使用 `accuracy_score()` 函数来计算模型的准确性。 通过以上步骤,我们就可以构建一个简单的逻辑回归模型,用于预测居民出行选择行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸洋红就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值