机器学习——逻辑回归实验分析

逻辑回归实验分析

此逻辑回归实验分析主要介绍了单分类和多分类问题,以及对应等高线的绘制

使用的数据集是sklearn内置数据集iris.csv

回归是如何变成分类的呢?

之前在线性回归问题中,得到了具体的回归值,如果此时任务要做一个二分类该怎么办呢?

如果可以将连续的数值转换成对应的区间,这样就可以完成分类任务了,逻辑回归中借助sigmoid函数完成了数值映射,通过概率值比较来完成分类任务

首先导包:

import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
# 字体大小设置
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
# 过滤警告
import warnings
warnings.filterwarnings('ignore')
np.random.seed(42)

神奇的sigmoid函数

t = np.linspace(-10,10,100)
sig = 1/(1+np.exp(-t))
plt.figure(figsize=(9,3))
plt.plot([-10,10],[0,0],'k-')
plt.plot([-10,10],[0.5,0.5],'k:')
plt.plot([-10,10],[1,1],'k:')
plt.plot(t,sig,'b-',linewidth=2,label=r"$\sigma(t) = \frac{1}{1+e^{-t}}$")
plt.xlabel('t')
plt.legend(loc='upper left', fontsize=20)
plt.axis([-10,10,-0.1,1.1])
plt.title('Figure 4-21. Logistic Function')
plt.show()

结果:

加载sklearn数据集

from sklearn import datasets
iris = datasets.load_iris()
list(iris.keys())

对于传统逻辑回归,要对标签多变换,也就是属于当前类别为1,其他类别为0

X = iris['data'][:,3:]
# 将其中一种花设置成1,则其他花表示为0
y = (iris['target']==2).astype(np.integer)

可以先看一下y的结果:

然后导入逻辑回归,并训练

# 导入逻辑回归
from sklearn.linear_model import LogisticRegression
# 实例化
log_res = LogisticRegression()
log_res.fit(X,y)

结果:

测试数据,得到概率值

# 测试数据
X_new = np.linspace(0,3,1000).reshape(-1,1)
# 得到概率值
y_proba = log_res.predict_proba(X_new)
# y_proba.shape[0]   #表示y_proba有1000个数据
y_proba

结果:

随着输入特征数值的变化,结果概率值也会随之变化

单分类,基于Virginica花,画等高线

plt.figure(figsize=(12,5))
# 画出交叉点的边界线
decision_boundary = X_new[y_proba[:,1]>=0.5][0]
plt.plot([decision_boundary,decision_boundary],[-1,2],'k:',linewidth=2)
plt.plot(X_new,y_proba[:,1],'g-',label='Iris-Virginica')
plt.plot(X_new,y_proba[:,0],'b--',label='Not Iris-Virginica')
# 加上指引箭头
plt.arrow(decision_boundary[0],0.08,-0.3,0,head_width=0.05,head_length=0.1,fc='b',ec='b')
plt.arrow(decision_boundary[0],0.92,0.3,0,head_width=0.05,head_length=0.1,fc='g',ec='g')
# 加字
plt.text(decision_boundary[0]+0.02,0.15,'Decision Boundary',fontsize=12,color='k',ha='center')
plt.xlabel('Peta width(cm)')
plt.ylabel('y_proba')
plt.axis([0,3,-0.02,1.02])
plt.legend()
plt.show()

结果:

单分类任务

坐标棋盘制作

# 选择数据
X = iris['data'][:,(2,3)]
y = (iris['target']==2).astype(np.integer)
# 构建逻辑回归模型
# 导入逻辑回归
from sklearn.linear_model import LogisticRegression
# 实例化
log_res = LogisticRegression()
# 训练
log_res.fit(X,y)

### 决策边界的绘制
- 构建坐标数据,合理的范围当中,根据实际训练时输入数据来决定
- 整合坐标点,得到所有测试输入数据坐标点
- 预测,得到所有点的概率值
- 绘制等高线,完成决策边界

构建坐标数据:

# 构建足够大的坐标棋盘,尽量拿到更多的数据
x0, x1 = np.meshgrid(np.linspace(2.9,7,500).reshape(-1,1),np.linspace(0.8,2.7,200).reshape(-1,1))
X_new = np.c_[x0.ravel(),x1.ravel()]
# 预测概率值
y_proba = log_res.predict_proba(X_new)

然后就可以进行画图:

# 画图
plt.figure(figsize=(10,4))
# 先把当前的数据点展示出来
plt.plot(X[y==0,0],X[y==0,1],'bs')
plt.plot(X[y==1,0],X[y==1,1],'g^')
# 画等高线
zz = y_proba[:,1].reshape(x0.shape)
contour = plt.contour(x0,x1,zz,cmap=plt.cm.brg)
plt.clabel(contour,inline=1)
plt.axis([2.9,7.0,0.8,2.7])
plt.text(3.2,1.5,'Not Vir',fontsize=14,color='b')
plt.text(6.5,2.5,'Vir',fontsize=14,color='g')

结果:

多分类任务

如何进行多类别分类呢?Softmax该登场了

Softmax整体上就是做归一化

先放大差异,再做归一化,得完概率值

训练数据:

X=iris['data'][:,(2,3)]
y=iris['target']
softmax_reg = LogisticRegression(multi_class='multinomial',solver='lbfgs')
softmax_reg.fit(X,y)

然后进行绘图:

x0, x1 = np.meshgrid(np.linspace(0,8,500).reshape(-1,1),np.linspace(0,3.5,200).reshape(-1,1))
X_new = np.c_[x0.ravel(),x1.ravel()]
# 预测概率值
y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)
# 画等高线
zz1 = y_proba[:,1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)

plt.figure(figsize=(10,4))
plt.plot(X[y==2,0],X[y==2,1],'g^',label='Iris_Virginica')
plt.plot(X[y==1,0],X[y==1,1],'bs',label='Iris_Versicolor')
plt.plot(X[y==0,0],X[y==0,1],'yo',label='Iris_Setosa')

from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])

plt.contourf(x0,x1,zz,cmap=custom_cmap)
contour = plt.contour(x0,x1,zz1,cmap=plt.cm.brg)
plt.clabel(contour,inline=1,fontsize=12)
plt.xlabel('Petal length',fontsize=14)
plt.ylabel('petal width',fontsize=14)
plt.legend(loc='center left',fontsize=14)
plt.axis([0,7,0,3.5])
plt.show()

结果:

        

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值