如何平衡地划分训练集与测试集

版权申诉
0 下载量 101 浏览量 更新于2024-11-04 收藏 703B ZIP 举报
资源摘要信息:"在处理机器学习和数据分析问题时,经常需要将数据集分割为训练集和测试集,以便在训练模型时使用前者,而在验证模型性能时使用后者。当数据集包含了不同标签的样本,我们还需要确保训练集和测试集在标签上的分布尽可能接近原始数据集,这样的分割过程被称为数据集的平衡分割。 平衡分割的数据处理方法对于分类问题尤为重要,尤其是当某些类别中的样本数量远多于其他类别时,非平衡的数据集可能导致模型在预测少数类时性能较差。因此,在数据预处理阶段进行平衡分割可以提高模型的泛化能力和公平性。 在本次提供的资源中,标题“create_balanced_train_test.zip_The Divide”表明这是一个用于数据集平衡分割的脚本包,它包括了一个名为“create_balanced_train_test.m”的Matlab文件。这个文件是针对Matlab环境编写的,用于实现数据的平衡分割功能。 通常,Matlab是一个强大的数值计算和工程仿真软件环境,它提供了多种工具箱和函数库,支持数据分析和机器学习任务。Matlab中的脚本通常包含了一系列的命令和函数调用,用于完成特定的数据处理流程。 在描述中,“Divide/Create data into training and testing data which are balanced basing on the labels.”说明了该脚本的具体作用:基于数据集中的标签将数据集分割成训练集和测试集,并且确保这些子集在各个标签上的样本数分布是均衡的。这意味着,如果原始数据集中有五个不同的标签,每个标签对应的训练集和测试集中的样本数量将大致相同,以减少类别不平衡对模型性能的影响。 在实际应用中,实现数据集平衡分割的方法有很多,比如随机过采样少数类、欠采样多数类或使用更复杂的合成方法如SMOTE(Synthetic Minority Over-sampling Technique)等。不同的方法适用于不同的数据集和问题,具体采用哪种方法需要根据实际情况和需求来决定。 在Matlab中,创建训练和测试子集的过程通常涉及以下步骤: 1. 加载数据:首先需要加载整个数据集到Matlab环境中。 2. 标签划分:将数据集按照其标签进行分组。 3. 分割操作:对每个标签组中的数据进行随机分配,将其分为训练集和测试集两部分,同时要确保两部分的大小比例符合预定的平衡要求。 4. 数据保存:将分割后的训练集和测试集分别保存为新的数据文件,供后续的模型训练和测试使用。 由于提供的文件名为“create_balanced_train_test.m”,我们可以合理推测该文件是用于执行上述步骤的Matlab脚本。通过运行该脚本,数据科学家和机器学习工程师能够更快速、更一致地进行数据集的平衡分割,从而为后续的模型训练提供高质量的数据输入。"

final_valid_predictions = {} final_test_predictions = [] scores = [] log_losses = [] balanced_log_losses = [] weights = [] for fold in range(5): train_df = df[df['fold'] != fold] valid_df = df[df['fold'] == fold] valid_ids = valid_df.Id.values.tolist() X_train, y_train = train_df.drop(['Id', 'Class', 'fold'], axis=1), train_df['Class'] X_valid, y_valid = valid_df.drop(['Id', 'Class', 'fold'], axis=1), valid_df['Class'] lgb = LGBMClassifier(boosting_type='goss', learning_rate=0.06733232950390658, n_estimators = 50000, early_stopping_round = 300, random_state=42, subsample=0.6970532011679706, colsample_bytree=0.6055755840633003, class_weight='balanced', metric='none', is_unbalance=True, max_depth=8) lgb.fit(X_train, y_train, eval_set=(X_valid, y_valid), verbose=1000, eval_metric=lgb_metric) y_pred = lgb.predict_proba(X_valid) preds_test = lgb.predict_proba(test_df.drop(['Id'], axis=1).values) final_test_predictions.append(preds_test) final_valid_predictions.update(dict(zip(valid_ids, y_pred))) logloss = log_loss(y_valid, y_pred) balanced_logloss = balanced_log_loss(y_valid, y_pred[:, 1]) log_losses.append(logloss) balanced_log_losses.append(balanced_logloss) weights.append(1/balanced_logloss) print(f"Fold: {fold}, log loss: {round(logloss, 3)}, balanced los loss: {round(balanced_logloss, 3)}") print() print("Log Loss") print(log_losses) print(np.mean(log_losses), np.std(log_losses)) print() print("Balanced Log Loss") print(balanced_log_losses) print(np.mean(balanced_log_losses), np.std(balanced_log_losses)) print() print("Weights") print(weights)

2023-07-08 上传

import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Dense, Conv1D, MaxPooling1D, Flatten from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix, classification_report from sklearn.metrics import roc_auc_score from sklearn.utils.class_weight import compute_class_weight # 读取数据 data = pd.read_csv('database.csv') # 数据预处理 X = data.iloc[:, :-1].values y = data.iloc[:, -1].values scaler = StandardScaler() X = scaler.fit_transform(X) # 特征选择 pca = PCA(n_components=10) X = pca.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(y_train), y=y_train) # 构建CNN模型 model = Sequential() model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(10, 1))) model.add(MaxPooling1D(pool_size=2)) model.add(Flatten()) model.add(Dense(10, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1)) X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1)) model.fit(X_train, y_train,class_weight=class_weights,epochs=100, batch_size=64, validation_data=(X_test, y_test)) # 预测结果 y_pred = model.predict(X_test) #检验值 accuracy = accuracy_score(y_test, y_pred) auc = roc_auc_score(y_test, y_pred) print(auc) print("Accuracy:", accuracy) print('Confusion Matrix:\n', confusion_matrix(y_test, y_pred)) print('Classification Report:\n', classification_report(y_test, y_pred))

2023-06-01 上传