机器学习:回归分析——逻辑回归的简单实现

逻辑回归的原理

基本概念

逻辑回归也被称为广义线性回归模型,与线性回归模型的形式基本上相同,最大的区别在于因变量不同。如果是连续的因变量,就是多重线性回归;如果是二项分布的因变量,就是逻辑(Logistic)回归。

这里主要说一下Logistic回归:
Logistic回归实际上是一种分类方法,主要用于二分类(注意是“主要”,不是仅)。Logistic回归的过程就是面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证这个求解的模型的好坏。
优点:速度快,适合二分类问题;简单、容易理解;可以直接看到各个特征的权重,容易更新模型吸收新的数据。
缺点:对数据和场景的适应能力有局限性,不如决策树算法适应性强。
用途:1、寻找危险因素:寻找某一疾病的危险因素等;2、预测:根据模型,预测在不同的自变量情况下,发生某种疾病或属于某种情况的概率有多;3、判别:实际上跟预测有些类似,也是根据模型,判断某种疾病或属于某种情况的概率有多大。

步骤:寻找预测函数h,构造损失函数J,想办法使得损失函数J最小并求得回归参数.

构造预测函数

二分类问题的概率与自变量之间的关系图形往往是一个如下所示的S型曲线,可用sigmoid函数(其实就是Logistic函数)表示,即
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

构造损失函数J

在多元线性回归中,一般采用最小二乘法来进行参数估计;相对应的,在逻辑回归中,一般采用最大似然法来进行参数估计。其基本原理是:找到一组参数,可以让样本数据所包含的观察值被观察到的可能性最大。最大似然法的优点是大样本数据中的参数的估计稳定、偏差小、估计方差小。

现采用极大似然法来求解损失函数:
在这里插入图片描述
在这里插入图片描述
上面已经将求解最大值问题转化为求解最小值问题,用梯度下降法求解 更新公式:
在这里插入图片描述
a相当于步长l

梯度下降法求解最小值

更新回归参数

在这里插入图片描述
所以回归参数的更新过程变为
在这里插入图片描述

向量化

主要是将上面的更新后的回归参数利用向量的表达更新为
在这里插入图片描述

正则化

对于逻辑回归就是相当于引入了基函数让线性回归模型变得更加灵活,但是也很容易造成过拟合。对于过拟合问题可以采用正则化解决,正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或惩罚项。正则化项一般是模型复杂的单调递增函数,模型越复杂,正则化项就越大。 正则化后现在的模型的损失函数可表示为:
在这里插入图片描述
(说实话,这里就没利用上面向量化的结果,不太清楚这个是怎么来的)
在这里插入图片描述
为正则化系数。如果它很大,则表示对模型的复杂度惩罚大,对拟合数据的损失惩罚小,这样就不会造成过分拟合数据,在训练数据上的偏差较大,在未知数据上的方差较小,但是可能出现欠拟合的现象;如果它很小,则说明比较注重对训练数据的拟合,在训练数据上的偏差会比较小,但是可能会导致过拟合。
正则化后的梯度下降算法回归系数的更新变为:
在这里插入图片描述

补充知识点,梯度上升与梯度下降

梯度上升

在这里插入图片描述
这样,在梯度下降中,公式
在这里插入图片描述

描述就容易解释了,在(0,1)区间,导数为正数,更新的x在增大,一直向最高点逼近;同样在(1,2)区间,导数为负数,更新的x描述在减小,一直向最高点逼近

梯度下降

一般用来求解最小值问题
在这里插入图片描述
公式
在这里插入图片描述

描述就容易解释了,在(-2,-1)区间,导数为负数,更新的x在增大,一直向最低点逼近;同样在(-1,-2)区间,导数为正数,更新的x在减小,一直向最低点逼近。
但是一般情况下我们求解最大值不是用梯度上升法,而是利用公式
在这里插入图片描述
将梯度上升问题转化为梯度下降的问题

逻辑回归的简单实现

数据形式

在这里插入图片描述

原理过程的实现

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

'''
处理原始数据:将文本数据读入,变成我们想要的数据集
'''
def parse_data():
    data = np.loadtxt('./data0.txt')
    dataMat = data[:, 0:-1]
    #最后一列是0,1标签列
    classLabels = data[:, -1]
    dataMat = np.insert(dataMat, 0, 1, axis=1)
    return dataMat, classLabels
'''
定义sigmod函数
'''
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
'''
定义损失函数
'''
def loss_funtion(dataMat, classLabels, weights):
    m, n = np.shape(dataMat)
    loss = 0.0
    for i in range(m):
        sum_theta_x = 0.0
        sum_theta_x = int(dataMat[i] * weights)
#        for j in range(n):
#            sum_theta_x += dataMat[i, j] * weights.T[0, j]
        propability = sigmoid(sum_theta_x)
        #其实这里是根据公式来的,这里比这公式里少了一个1/m
        #(-1/m) * np.sum((np.multiply(y, np.log(y_pred)) + np.multiply((1-y),np.log(1-y_pred))))
        loss += -classLabels[i, 0] * np.log(propability) - (1 - classLabels[i, 0]) * np.log(1 - propability)
    return loss 

#计算权重
def grad_descent(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)  #(m,n)
    labelMat = np.mat(classLabels).T
    m, n = np.shape(dataMatrix)
    weights = np.ones((n, 1))
    alpha = 0.01
    maxstep = 10000 #循环次数
    eps = 0.0001 #设定的一个阈值
    count = 0
    loss_array = []

    for i in range(maxstep):
        #先计算开始的损失
        loss = loss_funtion(dataMatrix, labelMat, weights)
        h_theta_x = sigmoid(dataMatrix * weights)
        #误差
        e = h_theta_x - labelMat
        #更新的权重
        new_weights = weights - alpha * dataMatrix.T * e
        #根据新更新的权重获取新的损失值
        new_loss = loss_funtion(dataMatrix, labelMat, new_weights)
        loss_array.append(new_loss)
        #更新前后损失值无太大差别,则不再循环求取权重
        if abs(new_loss - loss) < eps:
            break
        else:  #否则的话继续更新权重,直至达到最有循环数
            weights = new_weights
            count += 1
    
    print ("count is: ", count) #循环进行次数
    #print ("loss is: ", loss)
    print ("weights is: ", weights) #最终获取的权重值

    return weights, loss_array

#画出损失值收敛过程
def plotloss(loss_array):
    n = len(loss_array)
    plt.xlabel("iteration num")
    plt.ylabel("loss")
    plt.scatter(range(1, n+1), loss_array)
    plt.show()

data, labels = parse_data()
r, loss_array = grad_descent(data, labels)
r = np.mat(r).transpose()
plotloss(loss_array)

在这里插入图片描述

#坐标轴,画出边界
w = r.T
x = np.arange(-3.0,3.0,0.1)
x1 = list()
for i in x:
    x1.append([i])    
y = (-w[0]-x1*w[1])/w[2]
plt.scatter(data[:,1],data[:,2],c=labels)
plt.plot(x,y)

在这里插入图片描述

直接调包的实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
data = np.loadtxt('./data0.txt')
x = data[:,(0,1)]
y = data[:,2]
X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=0.3, random_state=0)
log_reg = LogisticRegression()

log_reg.fit(X_train, Y_train)
test_data_proba = log_reg.predict(X_test)

#模型准确率
accuracy = accuracy_score(Y_test,test_data_proba)
print('模型准确率:',accuracy)
x_plot = np.arange(-3.0,3.0,0.1)
x1 = list()
for i in x_plot:
    x1.append([i]) 
log_reg_coef = np.mat(log_reg.coef_).T
log_reg_intercept = np.mat(log_reg.intercept_)
y_plot = (- log_reg_intercept[0]- x1*log_reg_coef[0])/log_reg_coef[1]
plt.plot(x_plot,y_plot)
labels = data[:,2]
plt.scatter(data[:,0],data[:,1],c=labels)

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

  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值