generated from LufsX/Experiment-LogReg
This commit is contained in:
+23
-7
@@ -1,6 +1,8 @@
|
|||||||
# function.py
|
# function.py
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from sklearn.preprocessing import PolynomialFeatures
|
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"
|
id = "202210423xxx"
|
||||||
name = "熊浩燃"
|
name = "test_name"
|
||||||
|
|
||||||
def sigmoid(z):
|
def sigmoid(z):
|
||||||
return 1 / (1 + np.exp(-z))
|
return 1 / (1 + np.exp(-z))
|
||||||
@@ -36,9 +38,19 @@ def add_polynomial_features(X, degree=2):
|
|||||||
poly = PolynomialFeatures(degree)
|
poly = PolynomialFeatures(degree)
|
||||||
return poly.fit_transform(X)
|
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):
|
def train_logreg(X, y, learning_rate=0.0001, iterations=5000, batch_size=32, lambda_=0.1, degree=2):
|
||||||
"""
|
"""
|
||||||
对率回归训练函数,包含批量梯度下降和L2正则化,并增加多项式特征。
|
对率回归训练函数,包含批量梯度下降和L1正则化,并增加多项式特征。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
- X (numpy array): 特征数据。
|
- X (numpy array): 特征数据。
|
||||||
@@ -51,9 +63,11 @@ def train_logreg(X, y, learning_rate=0.0001, iterations=5000, batch_size=32, lam
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
- numpy array: 训练得到的权重。
|
- numpy array: 训练得到的权重。
|
||||||
|
- selector: 特征选择器,用于预测时筛选相同特征。
|
||||||
"""
|
"""
|
||||||
X = standardize(X) # 标准化数据
|
X = standardize(X) # 标准化数据
|
||||||
X = add_polynomial_features(X, degree=degree) # 增加多项式特征
|
X = add_polynomial_features(X, degree=degree) # 增加多项式特征
|
||||||
|
X, selector = select_features(X, y) # 特征选择
|
||||||
m, n = X.shape
|
m, n = X.shape
|
||||||
weights = np.random.rand(n) * 0.01 # 初始化权重为小的随机数
|
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
|
gradient = np.dot(X_batch.T, (h - y_batch)) / effective_batch_size + lambda_ * weights
|
||||||
weights -= learning_rate * gradient
|
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:
|
Args:
|
||||||
- inX (numpy array): 输入待分类的样本。
|
- inX (numpy array): 输入待分类的样本。
|
||||||
- weights (numpy array): 训练得到的权重。
|
- weights (numpy array): 训练得到的权重。
|
||||||
|
- selector: 特征选择器,用于筛选特征。
|
||||||
- degree (int): 多项式特征的次数。
|
- degree (int): 多项式特征的次数。
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -88,6 +103,7 @@ def predict_logreg(inX, weights, degree=2):
|
|||||||
"""
|
"""
|
||||||
inX = standardize(inX.reshape(1, -1)) # 标准化输入
|
inX = standardize(inX.reshape(1, -1)) # 标准化输入
|
||||||
inX = add_polynomial_features(inX, degree=degree) # 增加多项式特征
|
inX = add_polynomial_features(inX, degree=degree) # 增加多项式特征
|
||||||
|
inX = selector.transform(inX) # 应用特征选择,确保预测时与训练时使用相同的特征
|
||||||
probability = sigmoid(np.dot(inX, weights))
|
probability = sigmoid(np.dot(inX, weights))
|
||||||
return 1 if probability >= 0.5 else 0
|
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")
|
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]}")
|
print(f"预测结果: {y_pred}, 实际结果: {y_test[11]}")
|
||||||
|
|||||||
Reference in New Issue
Block a user