用zhengqi_train.txt写二元逻辑回归手写实现和调库实现包含准确率
时间: 2023-07-12 12:45:43 浏览: 109
kaggle工业蒸汽数据集
好的,我来回答你的问题。首先,二元逻辑回归是一种二分类算法,适用于特征向量线性可分的情况。其原理是将特征向量与权重向量进行点积并加上偏置,再将结果经过sigmoid函数映射到0~1之间,作为样本属于正类的概率。
手写实现二元逻辑回归的步骤如下:
1. 读取数据集并进行预处理,包括归一化、添加偏置等操作。
2. 初始化权重向量和偏置。
3. 使用梯度下降算法更新权重向量和偏置,直到达到收敛条件。
4. 根据训练好的模型预测测试集并计算准确率。
下面是使用Python实现的代码示例:
```python
import numpy as np
from sklearn.metrics import accuracy_score
# 读取数据
data = np.loadtxt('zhengqi_train.txt', delimiter='\t')
# 归一化
data[:, :-1] = (data[:, :-1] - np.mean(data[:, :-1], axis=0)) / np.std(data[:, :-1], axis=0)
# 添加偏置
data = np.insert(data, 0, values=1, axis=1)
# 划分训练集和测试集
train_data = data[:2000, :]
test_data = data[2000:, :]
# 初始化权重向量和偏置
w = np.zeros((train_data.shape[1]-1, 1))
b = 0
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义损失函数
def cost_function(X, y, w, b):
m = X.shape[0]
z = np.dot(X, w) + b
A = sigmoid(z)
cost = (-1/m) * np.sum(y*np.log(A) + (1-y)*np.log(1-A))
return cost
# 定义梯度下降函数
def gradient_descent(X, y, w, b, alpha, num_iterations):
m = X.shape[0]
for i in range(num_iterations):
z = np.dot(X, w) + b
A = sigmoid(z)
dw = (1/m) * np.dot(X.T, (A - y))
db = (1/m) * np.sum(A - y)
w -= alpha * dw
b -= alpha * db
return w, b
# 训练模型
X_train = train_data[:, :-1]
y_train = train_data[:, -1].reshape(-1, 1)
w, b = gradient_descent(X_train, y_train, w, b, alpha=0.01, num_iterations=1000)
# 预测测试集
X_test = test_data[:, :-1]
y_test = test_data[:, -1].reshape(-1, 1)
y_pred = sigmoid(np.dot(X_test, w) + b)
y_pred[y_pred >= 0.5] = 1
y_pred[y_pred < 0.5] = 0
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率:', accuracy)
```
使用sklearn库实现二元逻辑回归的步骤如下:
1. 读取数据集并进行预处理,包括归一化、划分训练集和测试集等操作。
2. 使用LogisticRegression类训练模型。
3. 预测测试集并计算准确率。
下面是使用Python实现的代码示例:
```python
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
# 读取数据
data = np.loadtxt('zhengqi_train.txt', delimiter='\t')
# 归一化
data[:, :-1] = (data[:, :-1] - np.mean(data[:, :-1], axis=0)) / np.std(data[:, :-1], axis=0)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data[:, :-1], data[:, -1], test_size=0.3, random_state=42)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测测试集
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率:', accuracy)
```
需要注意的是,使用sklearn库实现的二元逻辑回归通常会比手写实现的效果更好,因为它使用了更高级的优化算法(如L-BFGS)来求解最优参数。
阅读全文