data = pd.read_excel(‘C:/lydata/Traintest1.xlsx’) X = data.drop(‘HER2_G’, axis=1) y = data[‘HER2_G’] kf = KFold(n_splits=5, shuffle=True, random_state=42) accuracy_scores = [] precision_scores = [] recall_scores = [] f1_scores = [] auc_scores = [] total_confusion_matrix = np.zeros((len(np.unique(y)), len(np.unique(y))), dtype=int) rf = RandomForestClassifier(random_state=42, n_estimators=49, max_depth=4, class_weight=‘balanced’) rfe = RFE(rf, n_features_to_select=10) pipeline = Pipeline([ (‘smote’, SMOTE(k_neighbors=1,sampling_strategy=0.8, random_state=42)), (‘tomek’, TomekLinks()), (‘scaler’, StandardScaler()), (‘rfe’, rfe), (‘gb’, GradientBoostingClassifier( loss=‘log_loss’, learning_rate=0.03, n_estimators=1300, subsample=0.9, criterion=‘friedman_mse’, min_samples_split=2, min_samples_leaf=2, min_weight_fraction_leaf=0.0, max_depth=4, min_impurity_decrease=0.0, init=None, random_state=42, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=True, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0 )) ]) for train_index, test_index in kf.split(X): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) y_proba = pipeline.predict_proba(X_test)[:, 1] accuracy_scores.append(accuracy_score(y_test, y_pred)) precision_scores.append(precision_score(y_test, y_pred)) recall_scores.append(recall_score(y_test, y_pred)) f1_scores.append(f1_score(y_test, y_pred)) auc_scores.append(roc_auc_score(y_test, y_proba)) cm = confusion_matrix(y_test, y_pred) total_confusion_matrix += cm accuracy = np.mean(accuracy_scores) precision = np.mean(precision_scores) recall = np.mean(recall_scores) f1 = np.mean(f1_scores) auc = np.mean(auc_scores) print(“Gradient Boosting 参数:”) print(pipeline.named_steps[‘gb’].get_params()) print(f"Gradient Boosting 平均 accuracy: {accuracy:.2f}“) print(f"Gradient Boosting 平均 precision: {precision:.2f}”) print(f"Gradient Boosting 平均 recall: {recall:.2f}“) print(f"Gradient Boosting 平均 F1 score: {f1:.2f}”) print(f"Gradient Boosting 平均 AUC score: {auc:.2f}“) print(“综合混淆矩阵:”) print(total_confusion_matrix) pipeline.fit(X, y) test_data = pd.read_excel(‘C:/lydata/Testtest1.xlsx’) X_test = test_data.drop(‘HER2_G’, axis=1) y_test = test_data[‘HER2_G’] y_test_pred = pipeline.predict(X_test) y_test_proba = pipeline.predict_proba(X_test)[:, 1] accuracy_test = accuracy_score(y_test, y_test_pred) precision_test = precision_score(y_test, y_test_pred) recall_test = recall_score(y_test, y_test_pred) f1_test = f1_score(y_test, y_test_pred) auc_test = roc_auc_score(y_test, y_test_proba) print(f"测试集 accuracy: {accuracy_test:.2f}”) print(f"测试集 precision: {precision_test:.2f}“) print(f"测试集 recall: {recall_test:.2f}”) print(f"测试集 F1 score: {f1_test:.2f}“) print(f"测试集 AUC score: {auc_test:.2f}”) cm_test = confusion_matrix(y_test, y_test_pred) print(“测试集混淆矩阵:”)。面对代码中这些参数,我应该先怎么调,先对模型外的参数进行调整还是模型内的,还是同时进行,如果要调参,我应该怎么遍历

时间: 2025-06-19 10:19:32 浏览: 6
<think>好的,我现在需要帮助用户解决关于机器学习模型调参的问题。用户提供的代码中使用了Gradient Boosting模型,并且有一个复杂的pipeline,包括SMOTE、TomekLinks、特征选择、标准化等步骤。用户想知道应该先调整模型外的参数还是模型内的参数,或者同时进行,以及如何进行参数遍历。 首先,我需要理清用户代码中的结构。pipeline里有几个步骤:smote处理样本不平衡,tomek可能是用来清理噪声,scaler标准化数据,rfe特征选择,最后是gb分类器。调参需要考虑pipeline中的各个步骤的参数,比如SMOTE的k_neighbors,RFE选择的特征数量,以及GB本身的超参数。 用户的问题是关于调参顺序和方法的。通常,调参应该分步骤进行,先调整外部的预处理参数,再调整模型内部的参数,或者按照对模型影响的大小来排序。比如,特征选择的数量可能对模型性能影响较大,应该先确定,然后再调整模型的超参数。不过,也有可能某些参数之间有交互作用,需要联合调整,但这会增加计算量。 接下来,我需要考虑常见的调参策略。网格搜索和随机搜索是常用的方法,但在计算资源有限的情况下,分阶段调整可能更高效。例如,先确定特征选择的合适数量,再调整GB的参数。另外,pipeline中的步骤顺序也可能影响结果,比如先做SMOTE还是先做标准化,但用户这里已经确定了顺序,可能需要调整的是每个步骤的参数。 然后,关于参数的重要性。对于GB模型,重要的参数包括n_estimators、learning_rate、max_depth、subsample等。预处理步骤中的SMOTE参数,如k_neighbors和sampling_strategy,也可能影响结果,尤其是在处理类别不平衡时。RFE的特征数量也是关键,选择过少或过多都会影响模型性能。 用户可能没有意识到,调整参数时需要验证方法。代码中使用了5折交叉验证,这很好,但在调参时应该确保每个参数组合都经过交叉验证,避免过拟合。另外,测试集的评估应该只在最后进行,以保持结果的可靠性。 还有,用户提到的class_weight='balanced'在随机森林中使用,但在GB中没有设置,可能需要检查是否处理了类别不平衡。不过用户已经在pipeline中使用了SMOTE,可能已经处理了样本不平衡的问题。 另外,参数之间的依赖关系需要考虑。例如,n_estimators和learning_rate通常需要一起调整,因为较小的learning_rate可能需要更多的n_estimators。max_depth和min_samples_split等树的结构参数也需要联合调整。 现在,我需要将这些思考整理成一个步骤清晰的建议,告诉用户应该先调整哪些参数,后调整哪些,以及使用什么方法进行遍历。可能需要分阶段进行,先处理数据预处理和特征选择的参数,再调整模型本身的参数,最后进行联合微调。同时,推荐使用GridSearchCV或RandomizedSearchCV来自动化调参过程,并注意交叉验证的设置,避免数据泄露。 最后,提醒用户注意计算资源和时间,尤其是在参数空间较大时,随机搜索可能更高效。同时,测试集的评估应该在所有调参完成后进行,以得到无偏的估计。</think>以下是对代码调参的逐步指导,建议分阶段进行参数优化以提高效率: 一、参数调整顺序策略(由外到内) 1. **先调整模型外部参数**(预处理/特征选择) - 特征选择:`rfe.n_features_to_select`(当前10) - SMOTE参数:`k_neighbors`(当前1)、`sampling_strategy`(当前0.8) - 采样顺序:考虑是否需要`SMOTE+TomekLinks`组合或调整采样比例 2. **再调整模型内部参数**(梯度提升核心参数) - 基础参数:`n_estimators`(当前1300)、`learning_rate`(当前0.03) - 树结构:`max_depth`(当前4)、`min_samples_split`(当前2) - 正则化:`subsample`(当前0.9)、`max_features`(当前None) 二、参数遍历方法(分阶段优化) ```python # 示例:使用GridSearchCV分阶段调参 from sklearn.model_selection import GridSearchCV # 第一阶段:调整特征选择和相关采样参数 stage1_params = { 'rfe__n_features_to_select': [8, 10, 12], 'smote__k_neighbors': [1, 3, 5], 'smote__sampling_strategy': [0.6, 0.8, 1.0] } # 第二阶段:调整梯度提升核心参数 stage2_params = { 'gb__learning_rate': [0.01, 0.03, 0.05], 'gb__n_estimators': [1000, 1300, 1500], 'gb__max_depth': [3, 4, 5], 'gb__subsample': [0.8, 0.9, 1.0] } # 使用嵌套交叉验证 for param_grid in [stage1_params, stage2_params]: gs = GridSearchCV(pipeline, param_grid, cv=kf, scoring='roc_auc', n_jobs=-1) gs.fit(X, y) pipeline.set_params(**gs.best_params_) ``` 三、关键参数优先级(按影响度排序) 1. **高优先级**: - `learning_rate`与`n_estimators`的平衡:满足$E = n\_estimators \times learning\_rate$的经验公式 - `max_depth`:控制过拟合的核心参数,建议3-5层 - `subsample`:随机采样比例(建议0.8-1.0) 2. **中优先级**: - 特征选择数量:`n_features_to_select` - 采样策略组合:SMOTE+TomekLinks的参数组合 - `min_samples_split`:节点分裂最小样本数 四、注意事项 1. 使用交叉验证评估时: $$ \text{AUC} = \frac{1}{k}\sum_{i=1}^{k} \text{AUC}_i $$ 优先优化AUC指标,因其对类别不平衡更稳健 2. 参数交互关系: - `learning_rate`越小,需要越大的`n_estimators` - `max_depth`增加时,应适当降低`n_estimators` - `subsample`越小,正则化效果越强 3. 推荐工具: ```python from sklearn.model_selection import RandomizedSearchCV from scipy.stats import loguniform # 使用随机搜索处理高维参数空间 param_dist = { 'gb__learning_rate': loguniform(1e-3, 0.1), 'gb__n_estimators': [1000, 1500, 2000], 'gb__max_depth': randint(3, 6) } rs = RandomizedSearchCV(pipeline, param_dist, n_iter=50, cv=kf) ``` 建议先完成外部参数优化后,再集中调整模型内部参数。每次调整后应在独立测试集验证效果,注意最终测试集只能使用一次以避免过拟合。可考虑使用贝叶斯优化工具(如Hyperopt)进行自动化调参,效率比网格搜索提升约3-5倍。
阅读全文

相关推荐

data = pd.read_excel(‘C:/lydata/Traintest1.xlsx’) X = data.drop(‘HER2_G’, axis=1) y = data[‘HER2_G’] kf = KFold(n_splits=5, shuffle=True, random_state=42) accuracy_scores = [] precision_scores = [] recall_scores = [] f1_scores = [] auc_scores = [] total_confusion_matrix = np.zeros((len(np.unique(y)), len(np.unique(y))), dtype=int) rf = RandomForestClassifier(random_state=42, n_estimators=49, max_depth=4, class_weight=‘balanced’) rfe = RFE(rf, n_features_to_select=10) pipeline = Pipeline([ (‘smote’, SMOTE(k_neighbors=1,sampling_strategy=0.8, random_state=42)), (‘tomek’, TomekLinks()), (‘scaler’, StandardScaler()), (‘rfe’, rfe), (‘gb’, GradientBoostingClassifier( loss=‘log_loss’, learning_rate=0.03, n_estimators=1300, subsample=0.9, criterion=‘friedman_mse’, min_samples_split=2, min_samples_leaf=2, min_weight_fraction_leaf=0.0, max_depth=4, min_impurity_decrease=0.0, init=None, random_state=42, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=True, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0 )) ]) for train_index, test_index in kf.split(X): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) y_proba = pipeline.predict_proba(X_test)[:, 1] accuracy_scores.append(accuracy_score(y_test, y_pred)) precision_scores.append(precision_score(y_test, y_pred)) recall_scores.append(recall_score(y_test, y_pred)) f1_scores.append(f1_score(y_test, y_pred)) auc_scores.append(roc_auc_score(y_test, y_proba)) cm = confusion_matrix(y_test, y_pred) total_confusion_matrix += cm accuracy = np.mean(accuracy_scores) precision = np.mean(precision_scores) recall = np.mean(recall_scores) f1 = np.mean(f1_scores) auc = np.mean(auc_scores) print(“Gradient Boosting 参数:”) print(pipeline.named_steps[‘gb’].get_params()) print(f"Gradient Boosting 平均 accuracy: {accuracy:.2f}“) print(f"Gradient Boosting 平均 precision: {precision:.2f}”) print(f"Gradient Boosting 平均 recall: {recall:.2f}“) print(f"Gradient Boosting 平均 F1 score: {f1:.2f}”) print(f"Gradient Boosting 平均 AUC score: {auc:.2f}“) print(“综合混淆矩阵:”) print(total_confusion_matrix) pipeline.fit(X, y) test_data = pd.read_excel(‘C:/lydata/Testtest1.xlsx’) X_test = test_data.drop(‘HER2_G’, axis=1) y_test = test_data[‘HER2_G’] y_test_pred = pipeline.predict(X_test) y_test_proba = pipeline.predict_proba(X_test)[:, 1] accuracy_test = accuracy_score(y_test, y_test_pred) precision_test = precision_score(y_test, y_test_pred) recall_test = recall_score(y_test, y_test_pred) f1_test = f1_score(y_test, y_test_pred) auc_test = roc_auc_score(y_test, y_test_proba) print(f"测试集 accuracy: {accuracy_test:.2f}”) print(f"测试集 precision: {precision_test:.2f}“) print(f"测试集 recall: {recall_test:.2f}”) print(f"测试集 F1 score: {f1_test:.2f}“) print(f"测试集 AUC score: {auc_test:.2f}”) cm_test = confusion_matrix(y_test, y_test_pred) print(“测试集混淆矩阵:”)特征工程交叉应该放在代码什么位置

data = pd.read_excel('C:/lydata/test4.xlsx') X = data.drop('HER2_G', axis=1) y = data['HER2_G'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, stratify=y, random_state=42) kf = KFold(n_splits=5, shuffle=True, random_state=42) accuracy_scores = [] precision_scores = [] recall_scores = [] f1_scores = [] auc_scores = [] total_confusion_matrix = np.zeros((len(np.unique(y_train)), len(np.unique(y_train))), dtype=int) smote = SMOTE(k_neighbors=4, sampling_strategy=0.94, random_state=42) mi_selector = SelectKBest(score_func=mutual_info_classif, k=16) pipeline = Pipeline([ ('scaler', RobustScaler()), ('smote', smote), ('mi_selector', mi_selector), ('xgb', XGBClassifier( learning_rate=0.02, n_estimators=150, subsample=0.85, min_samples_split=5, min_samples_leaf=1, max_depth=6, random_state=42, tol=0.0001, ccp_alpha=0, max_features=9 )) ]) for train_index, val_index in kf.split(X_train): X_train_fold, X_val = X_train.iloc[train_index], X_train.iloc[val_index] y_train_fold, y_val = y_train.iloc[train_index], y_train.iloc[val_index] pipeline.fit(X_train_fold, y_train_fold) y_pred = pipeline.predict(X_val) y_proba = pipeline.predict_proba(X_val)[:, 1] accuracy_scores.append(accuracy_score(y_val, y_pred)) precision_scores.append(precision_score(y_val, y_pred)) recall_scores.append(recall_score(y_val, y_pred)) f1_scores.append(f1_score(y_val, y_pred)) auc_scores.append(roc_auc_score(y_val, y_proba)) cm = confusion_matrix(y_val, y_pred) total_confusion_matrix += cm accuracy = np.mean(accuracy_scores) precision = np.mean(precision_scores) recall = np.mean(recall_scores) f1 = np.mean(f1_scores) auc = np.mean(auc_scores) pipeline.fit(X_train, y_train) y_test_pred = pipeline.predict(X_test) y_test_proba = pipeline.predict_proba(X_test)[:, 1] accuracy_test = accuracy_score(y_test, y_test_pred) precision_test = precision_score(y_test, y_test_pred) recall_test = recall_score(y_test, y_test_pred) f1_test = f1_score(y_test, y_test_pred) auc_test = roc_auc_score(y_test, y_test_proba) print(f"测试集 AUC score: {auc_test:.2f}") cm_test = confusion_matrix(y_test, y_test_pred) print("测试集混淆矩阵:") print(cm_test) 为什么这个代码每次运行得出的指标结果都不一样

# 加载训练集数据 data = pd.read_excel(r'C:\Users\14576\Desktop\计算机资料\石波-乳腺癌\Traintest.xlsx') X = data.drop('HER2_G', axis=1) y = data['HER2_G'] # 特征工程 # 绝经状态与Age的交互 X['Menopause_Age_Interaction'] = X['绝经状态'] * X['Age'] discretizer = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile') X['Age_Bins'] = discretizer.fit_transform(X[['Age']]).ravel() # 特征交叉 X['Age_S1_LF_HF_Ratio'] = X['Age'] * (X['S1_LFpow_FFT (n.u.)'] / X['S1_HFpow_FFT (n.u.)']) X['BMI_S1_RMSSD_S1_SD1'] = X['BMI'] * X['S1_RMSSD (ms)'] * X['S1_SD1 (ms)'] X['S1_Mean_HR_ApEn'] = X['S1_Mean HR (bpm)'] * X['S1_ApEn'] X['S1_SDNN_S1_LFpow_FFT_ln_S1_TOTpow_FFT'] = (X['S1_SDNN (ms)'] / X['S1_LFpow_FFT (ms2)']) * np.log(X['S1_TOTpow_FFT (ms2)']) X['S1_VLFpow_FFT_S1_DFA1_S1_DFA2'] = X['S1_VLFpow_FFT (%)'] * X['S1_DFA1'] * X['S1_DFA2'] X['S1_SampEn_Sqrt_S1_SD2_S1_SD1'] = X['S1_SampEn'] * np.sqrt(X['S1_SD2 (ms)'] / X['S1_SD1 (ms)']) X['S1_MSE_1_S1_MSE_5'] = X['S1_MSE_1'] * X['S1_MSE_5'] X['S1_RESP_S1_HFpow_FFT_S1_TOTpow_FFT'] = X['S1_RESP (Hz)'] * (X['S1_HFpow_FFT (ms2)'] / X['S1_TOTpow_FFT (ms2)']) X['Risk_Score'] = (X['Age'] * X['BMI'] / X['S1_RMSSD (ms)']) + np.log(X['S1_LF_HF_ratio_FFT']) # 共线性处理:对交互项进行中心化处理 interaction_features = ['Menopause_Age_Interaction', 'Age_S1_LF_HF_Ratio', 'BMI_S1_RMSSD_S1_SD1', 'S1_Mean_HR_ApEn', 'S1_SDNN_S1_LFpow_FFT_ln_S1_TOTpow_FFT', 'S1_VLFpow_FFT_S1_DFA1_S1_DFA2', 'S1_SampEn_Sqrt_S1_SD2_S1_SD1', 'S1_MSE_1_S1_MSE_5', 'S1_RESP_S1_HFpow_FFT_S1_TOTpow_FFT', 'Risk_Score'] for feature in interaction_features: X[feature] = X[feature] - X[feature].mean() X_=X y_=y X_[feature]=X[feature] # 清理异常值 columns = [col for col in X_.columns if col not in ['Age','BMI','绝经状态']] # 异常值清理 for col in columns: Q1 = X_[col].quantile(0.25) Q3 = X_[col].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR # 明确转换数据类型 new_col_values = np.where(X_[col] < lower_bound, lower_bound, X_[col]) new_col_values = np.where(new_col_values > upper_bound, upper_bound, new_col_values) X_.loc[:, col] = new_col_values.astype(X_[col].dtype) # 填补空缺值KNN imputer = KNNImputer(n_neighbors=5, weights='distance') X = imputer.fit_transform(X_,y_) # 特征缩放(仅使用训练集数据进行缩放) scaler = RobustScaler() X = scaler.fit_transform(X) X = pd.DataFrame(X) # 方差 data_feature = pd.concat([X,y_],axis=1) p = data_feature.corr().loc['HER2_G'] corr = abs(p) corr = corr[corr<0.02] cols_to_drop = corr.index.to_list() # print(p.plot(kind='barh', figsize=(4,100))) X = data_feature.drop(cols_to_drop, axis=1) X.columns = X.columns.astype(str) # PCA Pca = PCA(n_components=25) X = Pca.fit_transform(X) # 使用XGB进行特征选择 rf = RandomForestClassifier(random_state=42, n_estimators=100, max_depth=4, class_weight='balanced') rfe = RFE(XGBClassifier(random_state=42), n_features_to_select=11) X = rfe.fit_transform(X, y_) # PCA pca = PCA(n_components=8) X = pca.fit_transform(X) X = pd.DataFrame(X) from sklearn.ensemble import RandomForestClassifier, VotingClassifier, GradientBoostingClassifier, AdaBoostClassifier from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.ensemble import GradientBoostingClassifier # 定义K折交叉验证 skf = KFold(n_splits=10, shuffle=True, random_state=42) # 进行 K 折交叉验证 for train_index, test_index in skf.split(X): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y_.iloc[train_index], y_.iloc[test_index] # 使用 SMOTE 过采样 smote = SMOTE(random_state=42) X_train, y_train = smote.fit_resample(X_train, y_train) tomek = TomekLinks() X_train, y_train = tomek.fit_resample(X_train, y_train) svm_classifier = XGBClassifier(random_state=42, scale_pos_weight=9) svm_classifier.fit(X_train, y_train) print('结束!')建立此训练模型的shap图

val_sub, y_val_sub)]) # 预测 y_pred = pipeline.predict(X_test_selected) y_proba = pipeline.predict_proba(X_test_selected)[:, 1] # 计算评估指标 accuracy_scores.append(accuracy_score(y_test, y_pred)) precision_scores.append(precision_score(y_test, y_pred)) recall_scores.append(recall_score(y_test, y_pred)) f1_scores.append(f1_score(y_test, y_pred)) auc_scores.append(roc_auc_score(y_test, y_proba)) # 累加混淆矩阵 cm = confusion_matrix(y_test, y_pred) total_confusion_matrix += cm # 计算平均评估指标 accuracy = np.mean(accuracy_scores) precision = np.mean(precision_scores) recall = np.mean(recall_scores) f1 = np.mean(f1_scores) auc = np.mean(auc_scores) print("XGBoost 参数:") print(pipeline.named_steps['xgb'].get_params()) print(f"XGBoost 平均 accuracy: {accuracy:.2f}") print(f"XGBoost 平均 precision: {precision:.2f}") print(f"XGBoost 平均 recall: {recall:.2f}") print(f"XGBoost 平均 F1 score: {f1:.2f}") print(f"XGBoost 平均 AUC score: {auc:.2f}") print("综合混淆矩阵:") print(total_confusion_matrix) # 加载测试集数据 test_data = pd.read_excel('C:/lydata/Testtest1.xlsx') X_test_final = test_data.drop('HER2_G', axis=1).copy() y_test_final = test_data['HER2_G'] # 特征工程 # 绝经状态与Age的交互 X_test_final.loc[:, 'Menopause_Age_Interaction'] = X_test_final['绝经状态'] * X_test_final['Age'] X_test_final.loc[:, 'Age_Bins'] = discretizer.transform(X_test_final[['Age']]).ravel() # 特征交叉 X_test_final.loc[:, 'Age_S1_LF_HF_Ratio'] = X_test_final['Age'] * (X_test_final['S1_LFpow_FFT (n.u.)'] / X_test_final['S1_HFpow_FFT (n.u.)']) X_test_final.loc[:, 'BMI_S1_RMSSD_S1_SD1'] = X_test_final['BMI'] * X_test_final['S1_RMSSD (ms)'] * X_test_final['S1_SD1 (ms)'] X_test_final.loc[:, 'S1_Mean_HR_ApEn'] = X_test_final['S1_Mean HR (bpm)'] * X_test_final['S1_ApEn'] X_test_final.loc[:, 'S1_SDNN_S1_LFpow_FFT_ln_S1_TOTpow_FFT'] = (X_test_final['S1_SDNN (ms)'] / X_test_final['S1_LFpow_FFT (ms2)']) * np.log(X_test_final['S1_TOTpow_FFT (ms2)']) X_test_final.loc[:, 'S1_VLFpow_FFT_S1_DFA1_S1_DFA2'] = X_test_final['S1_VLFpow_FFT (%)'] * X_test_final['S1_DFA1'] * X_test_final['S1_DFA2'] X_test_final.loc[:, 'S1_SampEn_Sqrt_S1_SD2_S1_SD1'] = X_test_final['S1_SampEn'] * np.sqrt(X_test_final['S1_SD2 (ms)'] / X_test_final['S1_SD1 (ms)']) X_test_final.loc[:, 'S1_MSE_1_S1_MSE_5'] = X_test_final['S1_MSE_1'] * X_test_final['S1_MSE_5'] X_test_final.loc[:, 'S1_RESP_S1_HFpow_FFT_S1_TOTpow_FFT'] = X_test_final['S1_RESP (Hz)'] * (X_test_final['S1_HFpow_FFT (ms2)'] / X_test_final['S1_TOTpow_FFT (ms2)']) X_test_final.loc[:, 'Risk_Score'] = (X_test_final['Age'] * X_test_final['BMI'] / X_test_final['S1_RMSSD (ms)']) + np.log(X_test_final['S1_LF_HF_ratio_FFT']) # 共线性处理:对交互项进行中心化处理 for feature in interaction_features: train_mean = X_train[feature].mean() # 使用最后一次循环的均值 X_test_final.loc[:, feature] = (X_test_final[feature] - train_mean).astype(X_test_final[feature].dtype) # 特征缩放(使用RobustScaler) X_test_final_scaled = scaler.transform(X_test_final) # 去除低方差特征(VarianceThreshold) X_test_final_no_var = var_thresh.transform(X_test_final_scaled) # 特征选择(递归特征消除) X_test_final_selected = rfe.transform(X_test_final_no_var) # 使用训练好的模型进行预测 y_test_final_pred = pipeline.predict(X_test_final_selected) # 预测概率(用于计算AUC等指标) y_test_final_proba = pipeline.predict_proba(X_test_final_selected)[:, 1] # 计算测试集的评估指标 accuracy_test = accuracy_score(y_test_final, y_test_final_pred) precision_test = precision_score(y_test_final, y_test_final_pred) recall_test = recall_score(y_test_final, y_test_final_pred) f1_test = f1_score(y_test_final, y_test_final_pred) auc_test = roc_auc_score(y_test_final, y_test_final_proba) print(f"测试集 accuracy: {accuracy_test:.2f}") print(f"测试集 precision: {precision_test:.2f}") print(f"测试集 recall: {recall_test:.2f}") print(f"测试集 F1 score: {f1_test:.2f}") print(f"测试集 AUC score: {auc_test:.2f}") # 计算测试集的混淆矩阵 cm_test = confusion_matrix(y_test_final, y_test_final_pred) print("测试集混淆矩阵:") print(cm_test)检查代码的数据泄露和逻辑问题,这个代码和上一个代码比怎么样,好还是不好

rar
基于51单片机仿真设计的零基础DIY制作表白利器—8x8LED矩阵显示(仿真电路+程序) 小圈圈、小爱心、囧字脸……只要是你想得到的,表情矩阵都能摆给你看,是不是很Cool呢~如果你不幸见到心仪的女孩就舌头打结,不妨考虑这个哦~ 现在很流行汽车表情仪(16×16的LED阵列),淘宝上,固定几个表情的(非阵列)要150左右,可以自定义表情的,16×16的要200多小300块。感觉自己DIY一个成本很低,于是先做一个8×8的表情矩阵,汽车上装着太小了,可以放在上班时候的工位上。哈哈哈。一般控制LED阵列的话,每一片8×8的阵列,使用一片max7219(约5元1片,美信公司的芯片都是很贵的)矩阵控制,或者使用两片 74HC595锁存器(约0.5元1片)。我买好了两片74HC595,不过想到一片8×8的阵列理论上应该可以直接使用一个89c51来控制(89c51有32个数据脚,arduino脚不够),仿真实验成功,省下了1块钱(2片595),哈哈。下面是成品图及我录的视频,我自己画了6个图切换。你发挥想象,可以做出更多的图来。我断断续续地在2天时间里抽时间把它做出来的(仿真实验和原理图我在N天前就已经做好了。本次DIY手工实际估算花费焊接40分钟,调试1小时)。 1 工具和材料 ○ 8x8 LED阵列,淘宝购得,单价4.7元(后来在diytrade.com上发现,一次性买32片的话,只需要0.7元一片); ○ STC89C52RC单片机一片, 淘宝购得,单价3.7元; ○ 51最小系统板一个,淘宝购得,单价3.9(此为亏本赚信用价,现在卖家已经涨价到9.9元。另有5.8元价格的,小一些,没有串口和 232芯片,做工也差一个级别。不如买9.9元的系统划算。); ○ 洞洞板一片,淘宝购得,单价0.4元; ○ 点触开关一个,淘宝购得价格0.4元(一定要买带盖子的,手感要好很多

最新推荐

recommend-type

企业项目管理知识培训.ppt

企业项目管理知识培训.ppt
recommend-type

IPMP-东风本田项目管理内部培训案例全本.ppt

IPMP-东风本田项目管理内部培训案例全本.ppt
recommend-type

时间管理lskjgkjshg

时间管理lskjgkjshg
recommend-type

hadoop架构介绍.ppt

hadoop架构介绍.ppt
recommend-type

感知器算法有代码.doc

感知器算法有代码.doc
recommend-type

Eclipse 3.4.2 VE可视化插件发布

根据提供的文件信息,我们可以从标题、描述以及文件名称列表中提炼出以下知识点: ### Eclipse3.4 VE(可视化)插件概述 Eclipse是一款开放源代码的、基于Java的可扩展IDE(集成开发环境),广泛用于开发Java应用程序和其他编程语言,如C、C++、Python等。Eclipse能够在各种操作系统上运行,例如Windows、Linux和Mac OS X。它通过插件来扩展其功能,其中包括很多社区和独立软件开发商提供的免费和付费插件。 ### Eclipse 3.4.2 版本特性 Eclipse 3.4.2是该IDE的一个更新版本,其主要特性包括但不限于: - 改进的性能和内存使用 - 新增和改进的用户界面元素 - 新的编辑器和视图功能 - 增强的插件和项目管理 - 支持更广泛的开发工具和技术 ### VE(可视化)插件 VE(可视化)插件是指“可视化编辑器”插件,它允许开发者以图形化的方式快速构建界面布局,适用于那些对用户界面开发有需求的项目。其具体功能通常包括: - 通过拖放的方式设计GUI组件 - 提供所见即所得(WYSIWYG)编辑界面 - 支持各种界面元素,如按钮、文本框、表格等 - 可以预览设计的用户界面在不同平台上的效果 - 界面代码自动生成,减少手动编码工作量 ### 插件使用场景 VE插件特别适用于: - 需要快速原型开发的应用程序 - 多平台GUI应用程序开发 - 非技术背景人员的快速入门 - 教育培训,帮助初学者理解界面设计原理 ### 重要性与影响力 尽管Eclipse本身就是一个功能强大的开发工具,但VE插件的加入进一步丰富了Eclipse的可用性,使得开发者能够在不编写复杂代码的情况下完成漂亮的用户界面设计。特别是在敏捷开发和快速迭代项目中,VE插件提供了巨大的便利。 ### 如何下载和安装 对于想要获取Eclipse 3.4 VE插件的用户,可以通过访问Eclipse官方网站或各大开源软件仓库,搜索对应的插件版本,然后下载并安装至Eclipse IDE中。通常情况下,下载的插件包是一个压缩文件,解压后即可使用。 ### 文件名称说明 文件名称“Eclipse VE1.4”暗示着这是一个与Eclipse相关的可视化编辑器插件的文件,而“1.4”可能表示该插件的版本号。一般来说,版本号越大代表插件的更新更频繁,功能越完善,修复的问题也越多。 ### 结语 Eclipse3.4 VE插件为Eclipse提供了一个强大的可视化编辑工具,使得开发者能够更加高效地进行用户界面设计与开发。虽然这个版本可能已经是较早前的版本,但理解它背后的技术和应用对于学习和使用后续版本仍然具有重要价值。对于需要学习或使用Eclipse进行开发的用户来说,掌握VE插件的使用将是一个有益的补充。
recommend-type

【性能测试基准】:为RK3588选择合适的NVMe性能测试工具指南

# 1. NVMe性能测试基础 ## 1.1 NVMe协议简介 NVMe,全称为Non-Volatile Memory Express,是专为固态驱动器设计的逻辑设备接口规范。与传统的SATA接口相比,NVMe通过使用PCI Express(PCIe)总线,大大提高了存储设备的数据吞吐量和IOPS(每秒输入输出操作次数),特别适合于高速的固态存储设备。
recommend-type

LINUX一次读取两个文本文档的指令

<think>好的,用户想查找Linux中同时读取两个文本文件的命令。首先,我需要明确“同时读取”具体指的是什么操作场景。可能的情况包括:逐行比较两个文件的内容、合并两个文件的内容、或者同时查看两个文件的输出等。 根据常见的Linux命令,逐行合并或比较通常会用到`paste`命令。例如,`paste file1.txt file2.txt`可以将两个文件的行按列合并,用制表符分隔。如果用户需要并排显示,这可能就是他们需要的。 另一个可能性是使用`diff`命令来比较两个文件的差异,比如`diff file1.txt file2.txt`,但用户的问题更偏向“读取”而非比较,所以可能不是最
recommend-type

基于Struts+Spring+Ibatis的项目实战示例

标题和描述所指的知识点是关于Java Web开发领域中一种流行的框架组合——Struts、Spring和iBatis。这三个框架各自负责不同的层面,组合在一起能够构建出结构清晰、功能完善的MVC(模型-视图-控制器)Web应用程序。下面将详细介绍这三大框架的核心概念与协同工作的原理。 ### Struts Struts是一个基于MVC设计模式的Web应用框架,它的主要作用是将Web层的表示逻辑与业务逻辑分离开来。在Struts框架中,主要的组件包括: - **ActionServlet**:充当控制器的角色,负责接收用户请求并根据请求调用相应的Action类。 - **Action**:处理用户请求的业务逻辑类,它通常与一个或多个业务对象交互。 - **ActionForm**:封装用户请求数据的类,用于在ActionServlet和Action之间传递数据。 - **ActionMapping**:配置文件(通常为struts-config.xml),用来定义请求URL、Action类以及JSP页面之间的映射关系。 - **Tiles**:是Struts的一个扩展插件,用于定义页面布局和页面片段的组装,以便于页面的重用和模块化开发。 ### Spring Spring是一个全方位的开源应用框架,其核心特性是依赖注入(DI)和面向切面编程(AOP)。在Web应用中,Spring框架的主要作用包括: - **依赖注入(DI)**:通过容器管理对象的创建和依赖关系,从而使得代码更加松耦合,便于测试和维护。 - **面向切面编程(AOP)**:用于分离业务逻辑中的横切关注点,比如事务管理、安全控制等。 - **Spring MVC**:作为Spring框架的一部分,Spring MVC提供了一种基于Spring IoC容器的MVC实现。它与Struts类似,但是提供了更加灵活的控制器设计和更加丰富的配置选项。 - **数据持久化支持**:Spring通过DAO(Data Access Object)抽象层和ORM(Object-Relational Mapping)技术结合,简化了数据库操作。 ### iBatis iBatis是一个提供数据持久层支持的框架。它的目标是帮助开发者直接编写SQL语句,并在对象与数据库之间建立映射。iBatis的主要特点包括: - **SQL映射文件**:在iBatis中,开发者可以定义SQL语句,并通过XML映射文件或注解将其映射到Java对象上。 - **对象-关系映射**:支持Java对象与数据库表之间的映射,可以将查询结果自动封装成Java对象。 - **动态SQL支持**:iBatis支持动态SQL语句,可以根据不同的条件拼接SQL片段,生成不同的SQL语句。 ### 组合使用Struts、Spring、iBatis 当Struts、Spring和iBatis一起使用时,它们之间通过配置文件和对象共享的方式进行协同工作。具体的工作流程大致如下: 1. **用户请求的接收与处理**:用户通过浏览器发出请求,请求被Struts的ActionServlet接收,根据配置文件中的映射关系,将请求转发给对应的Action对象。 2. **业务逻辑的执行**:Action对象将请求参数传递给对应的业务服务层(通常是一个Spring管理的Bean)。业务服务层可以利用Spring的依赖注入和面向切面编程的特性,完成业务逻辑的执行,并进行事务管理。 3. **数据持久化的操作**:在业务逻辑处理过程中,如果需要进行数据持久化操作,则会调用iBatis提供的DAO类或接口。这些类或接口根据映射文件中的SQL语句与数据库交互,将业务对象持久化到数据库中,或者从数据库中检索出业务对象。 4. **响应的返回**:业务逻辑和数据持久化操作完成后,Action对象会根据处理结果选择相应的JSP页面或结果视图,通过Struts框架返回给用户浏览器。 ### 结合标签和文件名称列表的分析 从给定的标签“struts+spring+ibatis”和文件名称列表“ssi”来看,我们可以推断出这个小项目使用了这三个框架的组合,并可能使用了ssi(Server Side Include)技术进行页面内容的重用和嵌入。ssi是一种服务器端的文件包含指令,通常用于在HTML页面中包含其他文件,如头文件、尾文件或广告等。ssi文件通常具有.ssi或.shtml的扩展名。 在这个项目中,ssi技术可能被用来简化页面的维护和开发,使得部分页面内容可以共享或动态生成,而Struts、Spring和iBatis则负责处理业务逻辑和数据的动态展示。ssi的使用与核心业务逻辑无直接关系,但在项目中可以提高页面维护的效率,并减少重复的代码编写。 综上所述,一个使用Struts、Spring和iBatis框架的小项目会通过这三种技术各自的优势和相互之间的协同工作,来实现高效、可维护的Web应用开发。通过合理的配置和代码设计,可以达到将Web层的视图展示、业务逻辑处理和数据持久化这三个层面清晰划分的效果,使得整个项目结构更加模块化,有利于团队协作与项目的长期维护。
recommend-type

【固态硬盘寿命延长】:RK3588平台NVMe维护技巧大公开

# 1. 固态硬盘寿命延长的基础知识 ## 1.1 固态硬盘的基本概念 固态硬盘(SSD)是现代计算设备中不可或缺的存储设备之一。与传统的机械硬盘(HDD)相比,SSD拥有更快的读写速度、更小的体积和更低的功耗。但是,SSD也有其生命周期限制,主要受限于NAND闪存的写入次数。 ## 1.2 SSD的写入次数和寿命 每块SSD中的NAND闪存单元都有有限的写入次数。这意味着,随着时间的推移,SSD的