更新 function.py
Gitea Actions Experiment Test / Experiment-Actions (push) Successful in 1m55s

This commit is contained in:
2024-10-31 15:37:28 +08:00
parent b0c53f2d32
commit caa899933d
+23 -7
View File
@@ -1,6 +1,8 @@
# function.py
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
"""
实验说明:
@@ -21,8 +23,8 @@ from sklearn.preprocessing import PolynomialFeatures
"""
请在这里填写学号和姓名,不填写即成绩无效。
"""
id = "202210423213"
name = "熊浩燃"
id = "202210423xxx"
name = "test_name"
def sigmoid(z):
return 1 / (1 + np.exp(-z))
@@ -36,9 +38,19 @@ def add_polynomial_features(X, degree=2):
poly = PolynomialFeatures(degree)
return poly.fit_transform(X)
def select_features(X, y, penalty='l1', C=1.0):
"""
使用L1正则化选择重要特征。
"""
model = LogisticRegression(penalty=penalty, solver='liblinear', C=C)
model.fit(X, y)
selector = SelectFromModel(model, prefit=True)
X_selected = selector.transform(X)
return X_selected, selector
def train_logreg(X, y, learning_rate=0.0001, iterations=5000, batch_size=32, lambda_=0.1, degree=2):
"""
对率回归训练函数,包含批量梯度下降和L2正则化,并增加多项式特征。
对率回归训练函数,包含批量梯度下降和L1正则化,并增加多项式特征。
Args:
- X (numpy array): 特征数据。
@@ -51,9 +63,11 @@ def train_logreg(X, y, learning_rate=0.0001, iterations=5000, batch_size=32, lam
Returns:
- numpy array: 训练得到的权重。
- selector: 特征选择器,用于预测时筛选相同特征。
"""
X = standardize(X) # 标准化数据
X = add_polynomial_features(X, degree=degree) # 增加多项式特征
X, selector = select_features(X, y) # 特征选择
m, n = X.shape
weights = np.random.rand(n) * 0.01 # 初始化权重为小的随机数
@@ -72,15 +86,16 @@ def train_logreg(X, y, learning_rate=0.0001, iterations=5000, batch_size=32, lam
gradient = np.dot(X_batch.T, (h - y_batch)) / effective_batch_size + lambda_ * weights
weights -= learning_rate * gradient
return weights
return weights, selector
def predict_logreg(inX, weights, degree=2):
def predict_logreg(inX, weights, selector, degree=2):
"""
对率回归预测函数。
Args:
- inX (numpy array): 输入待分类的样本。
- weights (numpy array): 训练得到的权重。
- selector: 特征选择器,用于筛选特征。
- degree (int): 多项式特征的次数。
Returns:
@@ -88,6 +103,7 @@ def predict_logreg(inX, weights, degree=2):
"""
inX = standardize(inX.reshape(1, -1)) # 标准化输入
inX = add_polynomial_features(inX, degree=degree) # 增加多项式特征
inX = selector.transform(inX) # 应用特征选择,确保预测时与训练时使用相同的特征
probability = sigmoid(np.dot(inX, weights))
return 1 if probability >= 0.5 else 0
@@ -129,8 +145,8 @@ if __name__ == "__main__":
X_test, y_test = load_data("./data/horse-colic.test")
# 训练对率回归模型
weights = train_logreg(X_train, y_train, learning_rate=0.0001, iterations=5000, batch_size=32, lambda_=0.1, degree=2)
weights, selector = train_logreg(X_train, y_train, learning_rate=0.0001, iterations=5000, batch_size=32, lambda_=0.1, degree=2)
# 测试单个数据
y_pred = predict_logreg(X_test[11], weights, degree=2)
y_pred = predict_logreg(X_test[11], weights, selector, degree=2)
print(f"预测结果: {y_pred}, 实际结果: {y_test[11]}")