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(“测试集混淆矩阵:”)。这里有一个关于机器学习分类建模的数据(192个样本,正负样本比例为2比1,53个特征),其中标签是乳腺癌分子分型HER2_G是否表达以及各个特征 Age Height Weight BMI 绝经状态 S1_PNS index S1_SNS index S1_Stress index S1_Mean RR (ms) S1_SDNN (ms) S1_Mean HR (bpm) S1_SD HR (bpm) S1_Min HR (bpm) S1_Max HR (bpm) S1_RMSSD (ms) S1_NNxx (beats) S1_pNNxx (%) S1_HRV triangular index S1_TINN (ms) S1_DCmod (ms) S1_ACmod (ms) S1_VLFpow_FFT (ms2) S1_LFpow_FFT (ms2) S1_HFpow_FFT (ms2) S1_VLFpow_FFT (log) S1_LFpow_FFT (log) S1_HFpow_FFT (log) S1_VLFpow_FFT (%) S1_LFpow_FFT (%) S1_HFpow_FFT (%) S1_LFpow_FFT (n.u.) S1_HFpow_FFT (n.u.) S1_TOTpow_FFT (ms2) S1_LF_HF_ratio_FFT S1_RESP (Hz) S1_SD1 (ms) S1_SD2 (ms) S1_SD2_SD1_ratio S1_ApEn S1_SampEn S1_D2 S1_DFA1 S1_DFA2 S1_RP_Lmean (beats) S1_RP_Lmax (beats) S1_RP_REC (%) S1_RP_DET (%) S1_RP_ShanEn S1_MSE_1 S1_MSE_2 S1_MSE_3 S1_MSE_4 S1_MSE_5,在给你的信息中,我对192个样本进行3比7划分为测试集和训练集,如果我想把模型换成catboost,有什么更改建议,包括catboost参数和标准化,过采样,特征选择等方法建议

时间: 2025-03-11 12:04:48 浏览: 99
<think>嗯,用户想把他们现在的机器学习模型从Gradient Boosting换成CatBoost。他们提供了当前的代码,使用RandomForest和Gradient Boosting的组合,还有SMOTE、TomekLinks、StandardScaler、RFE这些预处理和特征选择步骤。现在需要换成CatBoost,我需要考虑哪些方面呢? 首先,CatBoost本身有处理类别特征的能力,但用户的数据可能都是数值型,因为特征列表里都是Age、Height、BMI这些,没有看到明显的类别变量。不过可能需要确认一下是否有需要处理的地方。但用户现在的代码里用了StandardScaler,而CatBoost通常不需要标准化,因为基于决策树的模型对特征的尺度不敏感。所以可能需要去掉标准化步骤,或者保留的话影响也不大,但可能会影响计算效率。 然后,关于特征选择,当前使用的是RFE(递归特征消除)和RandomForest作为基模型。换成CatBoost的话,是否需要用CatBoost来做特征选择?或者继续用RFE但换成CatBoost作为估计器?不过RFE可能会增加计算时间,因为要反复训练模型。或者CatBoost有自己的特征重要性评估,可以在训练后选择特征,但用户可能想保持流程一致,所以可能保留RFE但替换基模型为CatBoost? 不过用户当前的pipeline里,RFE用的是RandomForestClassifier,如果换成CatBoost的话,可能需要调整RFE的estimator。例如,RFE的estimator换成CatBoostClassifier,但要注意CatBoost的参数设置是否合理,比如处理类别变量、是否使用silent模式等。 接下来,过采样部分,用户用了SMOTE和TomekLinks。CatBoost本身有处理类别不平衡的参数,比如class_weights或者auto_class_weights,但用户之前用了class_weight='balanced',可能在CatBoost中也需要设置类似的参数。另外,SMOTE的k_neighbors=1可能比较激进,需要注意是否和CatBoost配合良好。可能需要保持过采样步骤,但需要测试效果。 关于参数调整,CatBoost有一些特定的参数,比如迭代次数(iterations)、学习率(learning_rate)、深度(depth)、l2_leaf_reg等。用户当前的Gradient Boosting用了很多参数,比如n_estimators=1300,learning_rate=0.03,max_depth=4。CatBoost可能需要调整类似的参数,但可能需要不同的范围。例如,迭代次数通常在100-1000之间,学习率更小可能需要更多迭代次数。 另外,CatBoost的自动处理类别变量,虽然这里可能没有类别变量,但如果有的话,需要指定cat_features参数。不过根据用户提供的特征列表,应该都是数值型,所以可能不需要。 关于交叉验证,用户用了KFold,这部分应该可以保持不变。但需要确保CatBoost在交叉验证中的训练没有数据泄露,尤其是使用SMOTE时,应该在每次训练折叠内进行过采样,而当前代码已经是在pipeline中处理,所以没问题。 然后,评估指标部分,用户收集了accuracy、precision、recall、f1、auc,这些指标可以继续使用,不需要改变。 在替换模型的时候,需要注意pipeline中的步骤。当前pipeline的顺序是:SMOTE -> TomekLinks -> StandardScaler -> RFE -> GradientBoosting。换成CatBoost的话,可能需要调整是否需要StandardScaler。如果保留的话,可能可以,但CatBoost不需要,所以可能可以去掉,减少计算步骤。或者保留,但影响不大? 另外,特征选择的RFE步骤如果继续使用,可能需要调整基模型为CatBoost,但需要注意CatBoost在RFE中的表现。或者改用CatBoost内置的特征重要性来进行特征选择,例如SelectFromModel,这可能更高效。 此外,CatBoost有early_stopping_rounds参数,可以在训练时使用验证集来提前停止,避免过拟合。这可能对调参有帮助,但需要设置eval_set。不过当前代码中使用的是交叉验证,可能需要在每次折叠中划分训练和验证集,或者在CatBoost的参数中设置early_stopping_rounds,并提供一个eval_set。这可能需要在pipeline中处理,或者调整循环结构。 用户当前的测试集是独立读取的,可能已经划分好了,但原来的代码里似乎用了3:7划分,但后面又用了KFold,可能需要确认数据划分是否正确。不过用户现在的问题是如何替换模型为CatBoost,所以这部分可能不需要调整。 总结下来,替换为CatBoost的主要步骤包括: 1. 导入CatBoostClassifier并替换GradientBoostingClassifier。 2. 调整pipeline中的步骤,可能去除StandardScaler,或者保留但可能不必要。 3. 替换RFE的estimator为CatBoostClassifier,或者改用其他特征选择方法。 4. 设置CatBoost的参数,处理类别不平衡,调整学习率、深度、迭代次数等。 5. 确保过采样步骤(SMOTE和TomekLinks)在pipeline中的正确应用,避免数据泄露。 此外,需要注意CatBoost的一些特性,比如在训练时自动处理缺失值,这可能对数据有帮助,但用户的数据可能已经处理过缺失值。 可能的参数建议包括: - iterations:设置较大的值,如500-1000,配合early_stopping_rounds。 - learning_rate:较小的值,如0.03或0.05。 - depth:树深,比如4-6。 - l2_leaf_reg:正则化参数,防止过拟合。 - class_weights:处理不平衡数据,设置balanced或者根据比例计算。 - eval_metric:根据任务选择,比如Logloss、AUC等。 此外,可能需要调整特征选择步骤,比如使用CatBoost的特征重要性进行选择,而不是RFE,这可能更高效。 在代码修改方面,具体步骤可能包括: - 安装并导入CatBoost。 - 修改pipeline中的gb步骤为CatBoostClassifier,并设置参数。 - 调整或移除StandardScaler。 - 可能需要修改RFE的estimator为CatBoost,或者改用其他特征选择方法。 同时,需要注意CatBoost在处理数据时是否需要显式传递类别特征索引,但用户的数据中可能没有类别特征,因此可以忽略。 测试时,用户需要运行修改后的pipeline,并比较性能指标,可能需要调整参数以获得更好的结果。 最后,用户可能需要调整超参数优化,比如使用GridSearchCV或Optuna进行参数搜索,但当前问题可能只需要初步的替换建议。</think>以下是针对将模型替换为CatBoost的改进建议,分步骤说明: $\boxed{\text{一、模型替换核心步骤}}$ 1. 导入CatBoost模块并替换分类器 ```python from catboost import CatBoostClassifier # 替换pipeline中的gb步骤 pipeline = Pipeline([ ('smote', SMOTE(...)), # 保留原有参数 ('tomek', TomekLinks()), ('scaler', StandardScaler()), # 可选保留/移除 ('rfe', rfe), ('cb', CatBoostClassifier(verbose=0)) # 关闭训练日志 ]) ``` $\boxed{\text{二、关键参数配置建议}}$ ```python cb_params = { 'iterations': 800, # 树的数量 'learning_rate': 0.05, # 学习率 'depth': 4, # 树深度 'l2_leaf_reg': 3, # L2正则化 'class_weights': [1, 2], # 根据正负样本比例2:1设置 'eval_metric': 'AUC', # 优化目标 'random_seed': 42, 'auto_class_weights': 'Balanced' # 双重平衡 } ``` $\boxed{\text{三、流程优化建议}}$ 1. 特征选择优化 ```python # 方法一:改用CatBoost内置特征重要性 from sklearn.feature_selection import SelectFromModel rfe = SelectFromModel(CatBoostClassifier(**cb_params, verbose=0)) # 方法二:保留RFE但更换estimator rfe = RFE(estimator=CatBoostClassifier(**cb_params, verbose=0), n_features_to_select=10) ``` 2. 标准化处理建议 ```python # 决策树类模型可不做标准化,移除scaler步骤 pipeline.steps.pop(2) # 移除scaler步骤 ``` $\boxed{\text{四、类别不平衡处理增强}}$ ```python # SMOTE参数优化 SMOTE(sampling_strategy=0.85, # 稍高于原始比例 k_neighbors=3, # 更稳健的邻居数 random_state=42) ``` $\boxed{\text{五、完整代码示例}}$ ```python # 修改后的核心pipeline rf = CatBoostClassifier(**cb_params, verbose=0) rfe = RFE(rf, n_features_to_select=10) pipeline = Pipeline([ ('smote', SMOTE(sampling_strategy=0.85, k_neighbors=3, random_state=42)), ('tomek', TomekLinks()), ('rfe', rfe), ('cb', CatBoostClassifier(**cb_params, verbose=0)) ]) ``` $\boxed{\text{六、注意事项}}$ 1. **数据泄露预防**:确保所有预处理步骤在KFold循环内部完成 2. **早停机制**:添加`early_stopping_rounds=50`参数防止过拟合 3. **GPU加速**:添加`task_type='GPU'`参数(需支持CUDA) 4. **分类变量处理**:若存在类别特征需指定`cat_features`参数 $\boxed{\text{七、验证指标对比建议}}$ 建议保持现有验证体系,重点关注: 1. AUC和Recall的提升(类别不平衡场景关键指标) 2. 训练时间变化(CatBoost通常快于传统GBDT) 3. 特征重要性分布(通过`get_feature_importance()`分析) $\boxed{\text{八、参数调优方向}}$ 推荐使用Optuna进行超参数优化: ```python import optuna def objective(trial): params = { 'depth': trial.suggest_int('depth', 3, 8), 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3), 'l2_leaf_reg': trial.suggest_loguniform('l2_leaf_reg', 1e-3, 10.0) } model = CatBoostClassifier(**params) # 交叉验证计算指标 return np.mean(cross_val_score(...)) ``` 通过上述调整,可充分利用CatBoost在类别不平衡数据上的优势,同时保持流程的稳定性。建议先用默认参数运行基准测试,再逐步进行优化。
阅读全文

相关推荐

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}”) 这个代码我想对特征进行更好的筛选,应该使用什么方法

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)检查代码的数据泄露和逻辑问题,这个代码和上一个代码比怎么样,好还是不好

大家在看

recommend-type

《极品家丁(七改版)》(珍藏七改加料无雷精校全本)(1).zip

《极品家丁(七改版)》(珍藏七改加料无雷精校全本)(1).zip
recommend-type

密码::unlocked::sparkles::locked:创新,方便,安全的加密应用程序

隐身者 创新,方便,安全的加密应用程序。 加密无限位。 只记得一点。 Crypter是一款跨平台的加密应用程序,它使加密和解密变得很方便,同时仍然保持强大的安全性。 它解决了当今大多数安全系统中最弱的链接之一-弱密码。 它简化了安全密码的生成和管理,并且只需要记住一个位-MasterPass。 是一个加密应用程序,可以解密和加密包括文件和文件夹在内的任意数据。 该版本已发布,并针对macOS(OSX),Linux(适用于所有通过发行的发行版)和Windows(32和64位)进行了全面测试。 所有核心模块(提供核心功能的模块)都经过了全面测试。 会将MasterPass保存在操作系统的钥匙串中,因此您不必在每次打开应用程序时都输入它。 为了帮助加快开发速度,请发送PR剩下的内容做 如果您有任何建议,请打开一个问题,并通过PR进行改进! 还要签出 ( )一个分散的端到端加密消息传递应用程序。 链接到此自述文件: : 内容 安装 适用于所有主要平台的所有预构建二进制文件都可以在。 Crypter也适用于macOS的 。 因此,要安装它,只需在终端中运行以下命令:
recommend-type

HkAndroidSDK.zip

助于Android开发视频监控功能,根据ip地址可以远程操控,控制向左,向右,向下,向上以及转动摄像头,也可以放大和缩小
recommend-type

matlab的欧拉方法代码-BEM_flow_simulation:计算流体力学:使用边界元方法模拟障碍物周围/附近的流动

matlab的欧拉方法代码BEM_flow_simulation MATLAB上的计算流体力学: 目的是使用边界元素方法模拟任何障碍物附近或周围的任何形式的流动 使用BEM绕圆柱障碍物和接近均匀战争的潜在流动 非粘性势流的假设适用于导航斯托克斯方程(Euler方程),使用边界元方法,该代码模拟了在均匀垂直壁附近的尺寸稳定的圆柱障碍物周围的流动。 该系统不受其他方向的限制。 该代码是流体力学硕士1实习的主题,并且作为大型项目的第一块砖,该项目用于模拟复杂非均匀障碍物周围的粘性流动,因此可以自由继续。 类“ pot_flow_class”模拟垂直于垂直壁(两个障碍物之间的距离为H)附近圆柱2D障碍物(无量纲半径r = 1)附近的该势流。 流速为U = 1(无量纲)。 使用边界元素方法的第二层。 这样的流动的精确解决方案的代码允许验证无垂直壁模拟。
recommend-type

基于YOLO网络的行驶车辆目标检测matlab仿真+操作视频

1.领域:matlab,YOLO网络的行驶车辆目标检测算法 2.内容:基于YOLO网络的行驶车辆目标检测matlab仿真+操作视频 3.用处:用于YOLO网络的行驶车辆目标检测算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab2021a或者更高版本测试,运行里面的Runme_.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前文件夹窗口必须是当前工程所在路径。 具体可观看提供的操作录像视频跟着操作。

最新推荐

recommend-type

简单和有效:IBM的绩效管理.doc

简单和有效:IBM的绩效管理.doc
recommend-type

基于PLC的转速测量.docx

基于PLC的转速测量.docx
recommend-type

单目深度估计模型训练python

python
recommend-type

智能Excel首席顾问看机械制造业管理信息化发展.doc

智能Excel首席顾问看机械制造业管理信息化发展.doc
recommend-type

网络营销实训心得体会.doc

网络营销实训心得体会.doc
recommend-type

cc65 Windows完整版发布:6502 C开发工具

cc65是一个针对6502处理器的完整C编程开发环境,特别适用于Windows操作系统。6502处理器是一种经典的8位微处理器,于1970年代被广泛应用于诸如Apple II、Atari 2600、NES(任天堂娱乐系统)等早期计算机和游戏机中。cc65工具集能够允许开发者使用C语言编写程序,这对于那些希望为这些老旧系统开发软件的程序员来说是一大福音,因为相较于汇编语言,C语言更加高级、易读,并且具备更好的可移植性。 cc65开发工具包主要包含以下几个重要组件: 1. C编译器:这是cc65的核心部分,它能够将C语言源代码编译成6502处理器的机器码。这使得开发者可以用高级语言编写程序,而不必处理低级的汇编指令。 2. 链接器:链接器负责将编译器生成的目标代码和库文件组合成一个单独的可执行程序。在6502的开发环境中,链接器还需要处理各种内存段的定位和映射问题。 3. 汇编器:虽然主要通过C语言进行开发,但某些底层操作仍然可能需要使用汇编语言来实现。cc65包含了一个汇编器,允许程序员编写汇编代码段。 4. 库和运行时:cc65提供了一套标准库,这些库函数为C语言提供了支持,并且对于操作系统级别的功能进行了封装,使得开发者能够更方便地进行编程。运行时支持包括启动代码、中断处理、内存管理等。 5. 开发工具和文档:除了基本的编译、链接和汇编工具外,cc65还提供了一系列辅助工具,如反汇编器、二进制文件编辑器、交叉引用器等。同时,cc65还包含丰富的文档资源,为开发者提供了详尽的使用指南、编程参考和示例代码。 cc65可以广泛用于学习和开发6502架构相关的软件,尤其适合那些对6502处理器、复古计算机或者早期游戏系统有兴趣的开发者。这些开发者可能想要创建或修改旧式游戏、系统软件、仿真器,或者进行技术研究和学习。 尽管cc65是一个功能强大的工具,但它也要求开发者对目标平台的硬件架构和操作系统有足够的了解。这是因为6502并非现代处理器,它对内存访问、I/O操作和中断管理等有着特殊的限制和要求。因此,使用cc65需要开发者具备一定的背景知识,包括但不限于6502指令集、内存映射、硬件寄存器操作等方面的内容。 此外,cc65针对Windows平台进行了优化和封装,使得它可以在Windows操作系统上无缝运行,这对于习惯于Windows环境的用户是一个好消息。不过,如果用户使用的是其他操作系统,可能需要通过相应的兼容层或虚拟机来运行Windows环境,以便使用cc65工具。 总的来说,cc65提供了一种相对简单的方式来开发运行在6502处理器上的软件。它极大地降低了开发难度,使得更多的人能够接触和参与到基于6502平台的软件开发中来,为这个历史悠久的平台注入了新的活力。
recommend-type

【CLIP模型实战】:从数据预处理到代码实现的图文相似度计算完全指南

# 1. CLIP模型概述 在人工智能领域中,CLIP(Contrastive Language-Image Pre-training)模型作为一款开创性的多模态学习技术,已经成为业界瞩目的焦点。CLIP模型是由OpenAI在2021年推出的,其创新之处在于通过大规模的图文对齐数据进行预训练,能够理解和匹配图像与自然语言描述之间的关联性。CLIP突破了传统方法在特定任务上需要大规模标注数据的限制
recommend-type

车载以太网doip协议格式

<think>首先,用户的问题是:“我想查找关于车载以太网DOIP协议的数据格式或规范”。用户引用了站内内容,其中提到DoIP是基于以太网的通讯协议,用于传输UDS协议的数据,规范于ISO13400标准。关键点:-DoIP协议:DiagnosticcommunicationoverInternetProtocol-规范:ISO13400标准-数据格式:我需要提供关于DoIP数据格式的详细信息根据系统级指令:-所有行内数学表达式使用$...$格式-独立公式使用$$...$$格式并单独成段-LaTeX语法正确-使用中文回答-生成相关问题-回答中引用的段落末尾自然地添加引用标识-回答结构清晰,帮助用
recommend-type

JavaScript中文帮助手册:初学者实用指南

### JavaScript中文帮助手册知识点概述 #### 1. JavaScript简介 JavaScript是一种轻量级的编程语言,广泛用于网页开发。它能够增强用户与网页的交互性,使得网页内容变得动态和富有生气。JavaScript能够操纵网页中的HTML元素,响应用户事件,以及与后端服务器进行通信等。 #### 2. JavaScript基本语法 JavaScript的语法受到了Java和C语言的影响,包括变量声明、数据类型、运算符、控制语句等基础组成部分。以下为JavaScript中常见的基础知识点: - 变量:使用关键字`var`、`let`或`const`来声明变量,其中`let`和`const`是ES6新增的关键字,提供了块级作用域和不可变变量的概念。 - 数据类型:包括基本数据类型(字符串、数值、布尔、null和undefined)和复合数据类型(对象、数组和函数)。 - 运算符:包括算术运算符、关系运算符、逻辑运算符、位运算符等。 - 控制语句:条件判断语句(if...else、switch)、循环语句(for、while、do...while)等。 - 函数:是JavaScript中的基础,可以被看作是一段代码的集合,用于封装重复使用的代码逻辑。 #### 3. DOM操作 文档对象模型(DOM)是HTML和XML文档的编程接口。JavaScript可以通过DOM操作来读取、修改、添加或删除网页中的元素和内容。以下为DOM操作的基础知识点: - 获取元素:使用`getElementById()`、`getElementsByTagName()`等方法获取页面中的元素。 - 创建和添加元素:使用`document.createElement()`创建新元素,使用`appendChild()`或`insertBefore()`方法将元素添加到文档中。 - 修改和删除元素:通过访问元素的属性和方法,例如`innerHTML`、`textContent`、`removeChild()`等来修改或删除元素。 - 事件处理:为元素添加事件监听器,响应用户的点击、鼠标移动、键盘输入等行为。 #### 4. BOM操作 浏览器对象模型(BOM)提供了独立于内容而与浏览器窗口进行交互的对象和方法。以下是BOM操作的基础知识点: - window对象:代表了浏览器窗口本身,提供了许多属性和方法,如窗口大小调整、滚动、弹窗等。 - location对象:提供了当前URL信息的接口,可以用来获取URL、重定向页面等。 - history对象:提供了浏览器会话历史的接口,可以进行导航历史操作。 - screen对象:提供了屏幕信息的接口,包括屏幕的宽度、高度等。 #### 5. JavaScript事件 JavaScript事件是用户或浏览器自身执行的某些行为,如点击、页面加载、键盘按键、鼠标移动等。通过事件,JavaScript可以对这些行为进行响应。以下为事件处理的基础知识点: - 事件类型:包括鼠标事件、键盘事件、表单事件、窗口事件等。 - 事件监听:通过`addEventListener()`方法为元素添加事件监听器,规定当事件发生时所要执行的函数。 - 事件冒泡:事件从最深的节点开始,然后逐级向上传播到根节点。 - 事件捕获:事件从根节点开始,然后逐级向下传播到最深的节点。 #### 6. JavaScript高级特性 随着ECMAScript标准的演进,JavaScript引入了许多高级特性,这些特性包括但不限于: - 对象字面量增强:属性简写、方法简写、计算属性名等。 - 解构赋值:可以从数组或对象中提取数据,赋值给变量。 - 模板字符串:允许嵌入表达式。 - 异步编程:Promise、async/await等用于处理异步操作。 - 模块化:使用`import`和`export`关键字导入和导出模块。 - 类和模块:引入了`class`关键字,允许使用面向对象编程风格定义类,以及模块的声明。 #### 7. 开发工具和调试技巧 为了提高JavaScript开发效率和调试问题,以下是一些常用的工具和调试技巧: - 浏览器的开发者工具:包括控制台(Console)、元素查看器(Elements)、网络监控(Network)、源码编辑器(Sources)等。 - 断点调试:在源码编辑器中设置断点,逐步执行代码,查看变量值和程序流程。 - console.log:在控制台输出日志,帮助理解程序执行流程和变量状态。 - 使用JavaScript验证工具:如JSHint、ESLint等,可以在开发过程中进行代码质量检查。 以上就是《JavaScript中文帮助手册》中可能包含的主要知识点。作为初学者,通过这些内容可以系统地学习和掌握JavaScript基础和进阶知识,实现从初学到实践的跨越。在实际应用中,还需结合具体实例和项目练习,不断加深理解和熟练操作。
recommend-type

深入理解MySQL存储引擎:InnoDB与MyISAM的终极对决

# 1. MySQL存储引擎概述 MySQL数据库的灵活性和高性能在很大程度上得益于其存储引擎架构。**存储引擎**是MySQL中用于存储、索引、查询数据的底层软件模块。不同的存储引擎拥有不同的功能和特性,允许数据库管理员针对特定的应用需求选择最佳的存储引擎。例如,**InnoDB**提供事务支持和行级锁定,适用于需要ACID(原子