diff --git a/function.py b/function.py index b4418b7..007ec4d 100644 --- a/function.py +++ b/function.py @@ -33,39 +33,43 @@ from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score def load_data(): - # 下载并加载病马数据集 + # 加载病马数据集 url = "http://archive.ics.uci.edu/ml/machine-learning-databases/horse-colic/horse-colic.data" columns = [ - "surgery", "age", "hospital_number", "rectal_temp", "pulse", "respiratory_rate", - "temp_of_extremities", "peripheral_pulse", "mucous_membrane_color", - "capillary_refill_time", "pain", "peristalsis", "abdominal_distention", - "nasal_discharge", "vomit", "heart_rate", "rectal_exam_fecal", "packed_cell_volume", - "total_protein", "abdominal_fluid_type", "abdominal_fluid_color", "outcome" - ] + ["unused_" + str(i) for i in range(1, 9)] # 忽略最后8个无用特征 + "surgery", "age", "hospital_num", "rectal_temp", "pulse", "resp_rate", + "temp_of_extremities", "peripheral_pulse", "mucous_membrane", "capillary_refill_time", + "muscle_tone", "abdominal_distension", "nasal_discharge", "vomit", "heart_rate", + "rectal_exam_fecal", "packed_cell_volume", "total_protein", "abdominocentesis_fluid", + "abdominocentesis_fluid_appearance", "leukocyte_count", "outcome", "surgical_summary", + "lesion_type", "lesion_site", "lesion_size" + ] + data = pd.read_csv(url, header=None, names=columns, na_values='?') - data = pd.read_csv(url, header=None, names=columns, na_values="?") - - # 处理缺失值,用0填充 + # 数据预处理 + # 用0填充缺失值 data.fillna(0, inplace=True) - - # 转换目标变量,将2(死亡)和3(安乐死)合并为0(死亡),1(存活)保持不变 - data["outcome"] = data["outcome"].apply(lambda x: 0 if x in [2, 3] else 1) - - # 去掉特征3(hospital_number)和特征24~28(unused_1 到 unused_8) - data.drop(columns=["hospital_number"] + ["unused_" + str(i) for i in range(1, 9)], inplace=True) - + + # 选择特征23作为目标变量,将取值2(死亡)和3(安乐死)合并为一个值0(死亡),并重新编码为二分类问题 + data['outcome'] = data['outcome'].apply(lambda x: 0 if x in [2, 3] else 1) + + # 去掉特征3、特征24~28 + data.drop(columns=['hospital_num', 'surgical_summary', 'lesion_type', 'lesion_site', 'lesion_size'], inplace=True) + # 特征和标签 - X = data.drop(columns=["outcome"]) - y = data["outcome"] - - # 划分训练集和测试集(这里简单按7:3划分) - X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) - + X = data.drop(columns=['outcome']) + y = data['outcome'] + + # 划分训练集和测试集(这里我们模拟划分,实际应使用给定的300个训练样本和68个测试样本) + # 由于没有明确的划分方式,我们假设前300个为训练样本,后68个为测试样本(这通常不是实际做法,仅作为示例) + # 注意:实际应用中应根据数据集提供的信息来准确划分训练集和测试集 + X_train, X_test = X.iloc[:300], X.iloc[300:] + y_train, y_test = y.iloc[:300], y.iloc[300:] + return X_train, X_test, y_train, y_test def train_logreg(X_train, y_train): - # 训练逻辑回归模型 - model = LogisticRegression(max_iter=10000) # 设置足够多的迭代次数以确保收敛 + # 训练对率回归模型 + model = LogisticRegression(max_iter=10000) # 增加迭代次数以确保收敛 model.fit(X_train, y_train) return model @@ -74,10 +78,15 @@ def predict_logreg(model, X_test): y_pred = model.predict(X_test) return y_pred -# 示例调用 +def evaluate_model(y_test, y_pred): + # 评估模型性能 + accuracy = accuracy_score(y_test, y_pred) + return accuracy + +# 主函数(用于测试和展示) if __name__ == "__main__": X_train, X_test, y_train, y_test = load_data() model = train_logreg(X_train, y_train) y_pred = predict_logreg(model, X_test) - print(f"Accuracy: {accuracy_score(y_test, y_pred)}") - + accuracy = evaluate_model(y_test, y_pred) + print(f"Model Accuracy: {accuracy:.4f}")