手写实现二元逻辑回归,并求出准确率
时间: 2023-07-11 09:47:02 浏览: 97
好的,我可以帮你手写实现二元逻辑回归。
首先,我们需要定义我们的模型,它是一个基于 sigmoid 函数的二元分类器。sigmoid 函数的公式为:
$$
f(z) = \frac{1}{1 + e^{-z}}
$$
其中 $z = wx + b$,$w$ 是权重向量,$b$ 是偏置项。
我们的模型可以表示为:
$$
\hat{y} = f(wx + b)
$$
其中 $\hat{y}$ 是预测值,$f$ 是 sigmoid 函数。
接下来,我们需要定义损失函数。我们使用交叉熵损失函数,它的公式为:
$$
J(w,b) = -\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\log(\hat{y}^{(i)}) + (1 - y^{(i)})\log(1 - \hat{y}^{(i)}))
$$
其中 $m$ 是样本数量,$y^{(i)}$ 是第 $i$ 个样本的真实标签,$\hat{y}^{(i)}$ 是其预测值。我们的目标是最小化交叉熵损失函数。
接下来,我们可以使用梯度下降法来最小化损失函数。梯度下降法的公式为:
$$
w := w - \alpha \frac{\partial J(w,b)}{\partial w}
$$
$$
b := b - \alpha \frac{\partial J(w,b)}{\partial b}
$$
其中 $\alpha$ 是学习率,是一个超参数。
最后,我们需要实现一个函数来预测新数据的标签。我们的二元分类器的预测规则是:如果 $\hat{y} \ge 0.5$,则预测为 1,否则预测为 0。
下面是一个 Python 实现的例子:
```python
import numpy as np
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
if self.verbose and i % 10000 == 0:
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
print(f'Loss: {self.__loss(h, y)}')
def predict_prob(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X, threshold=0.5):
return self.predict_prob(X) >= threshold
```
使用该类,我们可以对数据进行训练和预测。这里给出一个简单的例子:
```python
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成样本数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X_train, y_train)
# 预测测试集标签
y_pred = model.predict(X_test)
# 计算准确率
accuracy = (y_pred == y_test).mean()
print(f'Accuracy: {accuracy}')
```
在这个例子中,我们使用 `make_classification` 函数生成了一个有 1000 个样本和 10 个特征的数据集。我们将它划分为训练集和测试集,然后使用 `LogisticRegression` 类训练了一个模型。最后,我们计算了模型在测试集上的准确率。
阅读全文