1. 理解对率回归算法原理。 2. 编程实现对数几率回归算法。 3. 将算法应用于西瓜数据集、鸢尾花数据集分类问题。
时间: 2023-06-11 13:07:48 浏览: 240
1. 对率回归是一种经典的二分类算法,它的主要思想是使用对数几率函数建立分类模型,根据模型预测的结果进行分类。
对数几率函数公式如下:
$$
logit(p) = \ln \frac{p}{1-p}
$$
其中,$p$ 表示样本为正例的概率,$logit(p)$ 表示对数几率。
对数几率回归的模型可以表示为:
$$
y = \sigma(w^Tx+b)
$$
其中,$x$ 表示样本特征,$w$ 表示权重向量,$b$ 表示偏置量,$\sigma$ 表示 sigmoid 函数,其公式为:
$$
\sigma(z) = \frac{1}{1+e^{-z}}
$$
对数几率回归的目标是最大化对数似然函数,即:
$$
\max_{w,b} \sum_{i=1}^m [y_i\ln h(x_i)+(1-y_i)\ln(1-h(x_i))]
$$
其中,$h(x_i)$ 表示模型预测的结果,$y_i$ 表示样本的真实标签,$m$ 表示样本数量。
2. 下面是对数几率回归的 Python 实现:
```python
import numpy as np
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=10000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
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 % 1000 == 0:
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
loss = -np.mean(y*np.log(h) + (1-y)*np.log(1-h))
print(f'loss: {loss} \t')
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
```
3. 下面是在西瓜数据集、鸢尾花数据集上应用对数几率回归的示例:
```python
from sklearn.datasets import load_iris, load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 西瓜数据集
data = pd.read_csv('watermelon.csv')
X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
# 鸢尾花数据集
data = load_iris()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
```
其中,西瓜数据集和鸢尾花数据集可以从 UCI 机器学习库中下载。
阅读全文