diff --git a/function.py b/function.py index c570041..ff5b9ff 100644 --- a/function.py +++ b/function.py @@ -1,106 +1,28 @@ -import numpy as np -from sklearn.preprocessing import StandardScaler +def train_logreg(X, y, random_state=42): + model = LogisticRegression(solver='liblinear', random_state=random_state) + model.fit(X, y) + return model -""" -请在这里填写学号和姓名,不填写即成绩无效。 -""" -id = "202210423224" -name = "吴杨洋" -def sigmoid(z): - """ - Sigmoid 激活函数。 - """ - return 1 / (1 + np.exp(-z)) +def predict_logreg(inX, model): + return int(model.predict([inX])[0]) -def train_logreg(X, y, numIter=1000, learning_rate=0.01, lambda_reg=0.01): - m, n = X.shape - weights = np.zeros(n) - for j in range(numIter): - for i in range(m): - z = np.dot(X[i], weights) - h = sigmoid(z) - error = y[i] - h - gradient = X[i] * error - reg_term = lambda_reg * weights - gradient += reg_term - weights += learning_rate * gradient - return weights - -def predict_logreg(inX, weights): - """ - 对率回归预测函数。 - - Args: - - inX (numpy array): 输入待分类的样本。 - - weights (numpy array): 训练得到的权重。 - - Returns: - - int: 预测的分类标签。 - """ - z = np.dot(inX, weights) - prob = sigmoid(z) - return 1 if prob >= 0.5 else 0 def load_data(filepath): - """ - 从文件中加载数据,若不自行正确实现,则无法通过评测,不记录成绩。 - - Args: - - filepath (str): 数据文件路径。 - - Returns: - - X (np.array): 特征数据。 - - y (np.array): 标签数据。 - """ - file = open(filepath) - fr = file.readlines() - data_list = [] - y = [] - for data in fr: - data = data.strip() - data = data.split(' ') - data_25 = data[24] - y.append(data[22]) - del data[-1] - del data[26] - del data[25] - del data[24] - del data[22] - del data[2] - for i in data_25: - data.append(i) - data = [0 if data_elem == '?' else float(data_elem) for data_elem in data] - data_list.append(data) - data_number = len(y) - y_train = np.array([1 if y[j] == '2' or y[j] == '3' else 0 for j in range(data_number)]) - X = np.array(data_list) - return X, y_train # 不在这里添加偏置项 - -def main(): - # 加载训练集 - X_train, y_train = load_data("./data/horse-colic.data") - # 加载测试集 - X_test, y_test = load_data("./data/horse-colic.test") - - # 创建标准化器实例 + data = np.genfromtxt(filepath, delimiter=' ', missing_values='?', filling_values=0) + labels = data[:, -1].astype(int) + data = data[:, :-1] + labels = np.where((labels == 2) | (labels == 3), 0, labels) + if data.shape[1] >= 3: + data = np.delete(data, 2, axis=1) scaler = StandardScaler() - - # 标准化特征数据 - X_train = scaler.fit_transform(X_train) - X_test = scaler.transform(X_test) - - # 添加偏置项 - X_train = np.insert(X_train, 0, 1, axis=1) # 训练集 - X_test = np.insert(X_test, 0, 1, axis=1) # 测试集 + data = scaler.fit_transform(data) + return data, labels - # 训练对率回归模型 - weights = train_logreg(X_train, y_train, numIter=1000, learning_rate=0.01, lambda_reg=0.1) + # 去掉不相关特征 + data = np.delete(data, [2] + list(range(23, 28)), axis=1) - # 测试单个数据 - y_pred_test = [predict_logreg(x, weights) for x in X_test] - accuracy_test = np.mean(y_pred_test == y_test) - print(f"Test Accuracy: {accuracy_test:.2f}") - -if __name__ == "__main__": - main() \ No newline at end of file + # 数据标准化 + scaler = StandardScaler() + data = scaler.fit_transform(data) + return data, labels \ No newline at end of file