From caa899933dc9cadcf731317ced2fc4dde5a9cbf0 Mon Sep 17 00:00:00 2001 From: Xionghaoran <719929980@qq.com> Date: Thu, 31 Oct 2024 15:37:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20function.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/function.py b/function.py index b6d9a7c..9bd062a 100644 --- a/function.py +++ b/function.py @@ -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]}")