要求动手从0实现 logistic 回归(只借助Tensor和Numpy相关的库)在人工构造的数据集上进行训练和测试,并从loss、训练集以及测试集上的准确率等多个角度对结果进行分析
时间: 2024-10-23 14:19:05 浏览: 39
为了手动实现逻辑回归(Logistic Regression),我们将使用Python的NumPy库进行矩阵运算和数据处理,而Tensor可以使用Numpy数组替代。首先,我们需要了解逻辑回归的基本原理,它是一种二分类模型,通过sigmoid函数将线性预测转换为概率。
以下是步骤概述:
1. **数据生成**:
- 创建一些人工构造的训练集和测试集样本,包括特征(输入)和标签(0或1)。
2. **初始化权重**:
- 设计随机权重w和偏置b作为模型参数。
3. **前向传播**:
- 定义sigmoid函数,计算每个样本的概率p = 1 / (1 + exp(-z)), 其中z = w.T @ features + b。
4. **损失函数**:
- 使用交叉熵损失函数(Binary Cross Entropy)计算当前预测与真实标签之间的差距。
5. **梯度下降优化**:
- 计算损失关于权重和偏置的梯度,然后更新w和b以最小化损失。
6. **循环训练**:
- 重复步骤3-5多次,直到达到预设的迭代次数或收敛条件。
7. **评估**:
- 在训练集和测试集上分别应用模型,计算准确率和其他性能指标。
8. **分析结果**:
- 分析loss曲线,观察是否随迭代次数降低;比较训练集和测试集的准确率,查看是否存在过拟合或欠拟合。
下面是伪代码实现:
```python
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, n_iters=100):
self.w = np.random.randn(features.shape[1])
self.b = 0
self.lr = learning_rate
self.n_iters = n_iters
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def forward(self, X):
linear_output = np.dot(X, self.w) + self.b
probabilities = self.sigmoid(linear_output)
return probabilities
def loss(self, y_pred, y_true):
m = len(y_true)
loss = (-y_true * np.log(y_pred) - (1 - y_true) * np.log(1 - y_pred)).mean()
return loss
def fit(self, X_train, y_train):
for _ in range(self.n_iters):
y_pred = self.forward(X_train)
dw = (1 / m) * np.dot(X_train.T, (y_pred - y_train))
db = (1 / m) * np.sum(y_pred - y_train)
self.w -= self.lr * dw
self.b -= self.lr * db
def predict(self, X_test):
return np.round(self.forward(X_test))
# 实例化并训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测及性能评估
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
train_accuracy = np.mean(y_pred_train == y_train)
test_accuracy = np.mean(y_pred_test == y_test)
# 结果分析
print(f"Training Loss: {model.loss(y_pred_train, y_train)}")
print(f"Train Accuracy: {train_accuracy}")
print(f"Test Accuracy: {test_accuracy}")
```
完成上述步骤后,你可以分析loss的变化趋势,训练集和测试集的准确率差异,以及其他可能的性能指标,如精确率、召回率等,来判断模型的表现。
阅读全文