用zhengqi_train.txt 实现二元逻辑回归手写实现和调库实现包含准确率
时间: 2023-07-11 17:47:12 浏览: 92
zhengqi_train.txt
好的,我来回答你的问题。
首先,二元逻辑回归是一种分类算法,适用于二分类问题。在本次实现中,我们使用 `zhengqi_train.txt` 数据集,该数据集是一个回归问题,因此我们需要将其转化为二分类问题。我们可以将数据集中的每个样本的 `target` 值与一个阈值进行比较,将大于阈值的样本归为一类,小于等于阈值的样本归为另一类。这里我们选择将阈值设为数据集中 `target` 值的中位数。
接下来,我们可以使用手写实现和调库实现两种方式来进行二元逻辑回归的实现。
1. 手写实现
首先,我们需要将数据集拆分为训练集和测试集。这里我们选择将数据集的前80%作为训练集,后20%作为测试集。
```python
import pandas as pd
import numpy as np
# 读取数据集
data = pd.read_csv('zhengqi_train.txt', sep='\t')
# 将数据集中的target值与中位数进行比较,将大于中位数的样本归为一类,小于等于中位数的样本归为另一类
threshold = np.median(data['target'])
data['label'] = (data['target'] > threshold).astype(int)
# 将数据集拆分为训练集和测试集
train_data = data[:int(len(data)*0.8)]
test_data = data[int(len(data)*0.8):]
```
接下来,我们可以定义二元逻辑回归的模型和损失函数。这里我们采用梯度下降法来求解损失函数的最小值。
```python
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义二元逻辑回归模型
class LogisticRegression:
def __init__(self, lr=0.01, max_iter=10000, tol=1e-4):
self.lr = lr # 学习率
self.max_iter = max_iter # 最大迭代次数
self.tol = tol # 收敛阈值
def fit(self, X, y):
# 给X添加一列全为1的列,用于计算截距
X = np.hstack((np.ones((X.shape[0], 1)), X))
# 初始化权重
self.w = np.zeros((X.shape[1], 1))
# 梯度下降求解最优权重
for i in range(self.max_iter):
# 计算预测值
y_pred = sigmoid(np.dot(X, self.w))
# 计算损失函数值
loss = -np.mean(y*np.log(y_pred) + (1-y)*np.log(1-y_pred))
# 计算梯度
grad = np.dot(X.T, (y_pred-y)) / X.shape[0]
# 更新权重
self.w -= self.lr * grad
# 判断是否收敛
if np.sum(np.abs(grad)) < self.tol:
break
def predict(self, X):
# 给X添加一列全为1的列,用于计算截距
X = np.hstack((np.ones((X.shape[0], 1)), X))
# 计算预测值
y_pred = sigmoid(np.dot(X, self.w))
# 将概率值转换为类别标签
y_pred = (y_pred > 0.5).astype(int)
return y_pred
```
接下来,我们可以使用训练集来训练我们的模型,并使用测试集来评估模型的性能。
```python
# 定义模型和损失函数
lr = LogisticRegression(lr=0.1, max_iter=10000, tol=1e-4)
# 训练模型
lr.fit(train_data.iloc[:, :-2].values, train_data.iloc[:, -1].values)
# 预测测试集
y_pred = lr.predict(test_data.iloc[:, :-2].values)
# 计算准确率
acc = np.mean(y_pred == test_data.iloc[:, -1].values)
print('准确率:', acc)
```
2. 调库实现
除了手写实现外,我们还可以使用sklearn库中的LogisticRegression类来实现二元逻辑回归。
```python
from sklearn.linear_model import LogisticRegression
# 将数据集拆分为训练集和测试集
train_data = data[:int(len(data)*0.8)]
test_data = data[int(len(data)*0.8):]
# 初始化模型
lr = LogisticRegression()
# 训练模型
lr.fit(train_data.iloc[:, :-2].values, train_data.iloc[:, -1].values)
# 预测测试集
y_pred = lr.predict(test_data.iloc[:, :-2].values)
# 计算准确率
acc = np.mean(y_pred == test_data.iloc[:, -1].values)
print('准确率:', acc)
```
以上就是手写实现和调库实现二元逻辑回归的过程,并计算出了模型的准确率。
阅读全文