LogisticRegression R 手写实现

本文介绍了如何在R语言中手动实现逻辑回归。通过读取数据、可视化和使用R内置的glm函数进行预分析,然后详细阐述了自定义逻辑回归的步骤,包括定义交叉熵损失函数、计算梯度、预测概率、迭代过程,并最终分析模型效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.读取数据

[数据来源:https://en.wikipedia.org/wiki/Logistic_regression]

rm(list=ls())
setwd("C:\\Users\\xiaokang\\Desktop\\课程\\博一下学期\\广义线性模型\\")
data=read.csv("Simulation\\dataset\\LogisticRegression\\exam_pass.csv")
print(data)
#这里我发现了Rmarkdown的一个警告,因为我在这里修改了默认的工作路径,
#但是 Rmarkdown提醒了我:我的工作路径已经改变了

可以看到该数据集只有20个样本;其中Hours表示学生考试复习用的时间;Pass=1表示学生通过考试;Pass=0表示学生并没有通过考试。

2.可视化

library(ggplot2)
ggplot(data=data,aes(x=Hours,y=Pass))+geom_point()

在这里插入图片描述
可以看到,只有一个变量HoursHoursHours,那么如果判别函数是线性函数,即分类平面等价于Hours=cHours=cHours=c,当Hours<cHours<cHours<c时,判定为考试不合格,当Hours>cHours>cHours>c时,判定为不合格,从图像上看,此数据显然是线性不可分的数据集,例如存在一个Hours=1.75Hours=1.75Hours=1.75,但该学生考试及格了,但是又有比他用的时间多的点考试不合格。所以建立的LogisticRegression的准确率肯定不能达到100%

3.使用R自带的glm函数拟合logisticRegression

library(stats)
data=as.data.frame(data)
y.glm=glm(Pass~Hours,family=binomial(link="logit"),data=data)
print(summary(y.glm))
print(y.glm$fitted.values)
print(predict(y.glm))
pred_val=y.glm$fitted.values>0.5
sprintf("一共预测正确了%d个样本",sum(pred_val==data$Pass))
print("预测错误的Hours为:");print(data$Hours[pred_val!=data$Pass])
# 分别是第 7, 9,12,14

可以看到和维基百科上拟合的效果完全一致,其中得到的判定函数为p(Y=1∣Hours)=e−4.0777+1.5046Hours1+e−4.0777+1.5046Hours=11+e4.0777−1.5046Hoursp(Y=1|Hours)=\frac{e^{-4.0777+1.5046Hours}}{1+e^{-4.0777+1.5046 Hours}}=\frac{1}{1+e^{4.0777-1.5046Hours}}p(Y=1Hours)=1+e4.0777+1.5046Hours

### 使用sklearn的LogisticRegression类完成手写数字识别任务 #### 数据预处理 在机器学习项目中,数据预处理是决定模型性能的关键环节[^3]。对于手写数字识别任务,通常使用MNIST数据集。该数据集包含28x28像素的灰度图像,每张图像表示一个数字(0-9)。以下是数据预处理的具体方法: 1. **加载数据** 使用`sklearn.datasets`模块中的`fetch_openml`函数加载MNIST数据集。 2. **数据清洗** 确保数据集中没有缺失值或异常值。如果需要,可以删除或填补缺失值。 3. **特征标准化** 为了提高模型的收敛速度和性能,需要对特征进行标准化处理。可以使用`StandardScaler`将像素值缩放到零均值和单位方差[^3]。 4. **划分训练集与测试集** 使用`train_test_split`函数将数据集划分为训练集和测试集,以便后续评估模型性能。 ```python from sklearn.datasets import fetch_openml from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载MNIST数据集 mnist = fetch_openml('mnist_784', version=1) X, y = mnist["data"], mnist["target"] # 特征标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) ``` #### 模型训练与预测 逻辑回归是一种常用的分类算法,适用于多分类问题。以下是使用`LogisticRegression`类进行模型训练和预测的具体方法: 1. **初始化模型** 使用`LogisticRegression`类创建逻辑回归模型实例。可以通过设置参数`multi_class='multinomial'`和`solver='lbfgs'`来支持多分类任务[^2]。 2. **训练模型** 使用`fit`方法在训练集上训练模型。 3. **模型预测** 使用`predict`方法对测试集进行预测,并计算模型的准确率。 ```python from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 初始化逻辑回归模型 model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000) # 训练模型 model.fit(X_train, y_train) # 预测测试集 y_pred = model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率: {accuracy:.4f}") ``` #### 性能评估 为了进一步分析模型性能,可以绘制学习曲线以观察模型在不同样本量下的表现[^4]。 ```python import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import ShuffleSplit from sklearn.model_selection import learning_curve # 定义交叉验证策略 cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0) # 绘制学习曲线 train_sizes, train_scores, test_scores = learning_curve(model, X_train, y_train, cv=cv, scoring="accuracy", train_sizes=np.linspace(0.1, 1.0, 10)) train_scores_mean = np.mean(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) plt.figure(figsize=(10, 6)) plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="Training score") plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation score") plt.xlabel("Training examples") plt.ylabel("Accuracy") plt.legend(loc="best") plt.title("Learning Curve for Logistic Regression") plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值