请帮我修改代码,自动筛选出来Outcome正类:负类是1:1数据量的数据进行训练# 1. 读取Excel文件 file_path = 'D:\\OneDrive\\Qing\\AIDM\\dementia_dataset.csv' df_numeric = pd.read_csv(file_path) # 2. 分离特征和目标变量 X = df_numeric.drop(columns=['Reference Key', 'Outcome']) y = df_numeric['Outcome'] # 3. 数据分割:80%训练集,20%测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
时间: 2025-06-27 07:08:18 浏览: 16
<think>好的,我现在需要帮助用户解决如何用Python代码从数据集中筛选出Outcome正负类比例为1:1的数据,并进行模型训练。用户提到了使用pandas和train_test_split,以及样本均衡处理。让我仔细想想应该怎么做。
首先,用户的需求是让正负样本比例达到1:1。这意味着在筛选后的数据集中,正类和负类的样本数量相同。常见的方法可能是对多数类进行欠采样,或者对少数类进行过采样。这里用户可能希望保持数据的真实性,所以可能选择欠采样,即减少多数类样本的数量,使其与少数类数量相同。
接下来,我需要用pandas来处理数据集。假设用户的DataFrame中有一个名为'Outcome'的列,其中正类为1,负类为0。首先需要分别统计正负类的数量,然后确定较小的那个数量作为采样的数量。例如,如果正类有100个,负类有150个,那么应该从负类中随机选取100个样本,与正类的100个合并,形成1:1的比例。
然后,需要用到pandas的抽样方法,比如groupby和sample。或者,也可以将正负类的DataFrame分开,再取其中较小的数量,合并起来。比如,使用布尔索引筛选正类和负类,然后对数量较多的类进行随机抽样,使其数量与较少的类相同。
之后,合并两个类别的样本,得到平衡的数据集。然后,使用train_test_split来划分训练集和测试集。这里需要注意的是,在划分时保持类别的比例,所以可能需要使用stratify参数,确保训练集和测试集中的正负比例一致。
可能的代码步骤是:
1. 导入必要的库,如pandas和sklearn的train_test_split。
2. 读取数据集,假设是train_df。
3. 分离正类和负类的样本。
4. 确定正类和负类的样本数,取较小的那个数目。
5. 对样本较多的类进行随机抽样,使其数量等于较小的数目。
6. 合并抽样后的数据,形成平衡的数据集。
7. 划分特征和标签,如X和y。
8. 使用train_test_split,设置stratify参数为y,确保分层抽样。
9. 进行模型训练。
需要检查是否有特殊情况,比如正类和负类数量相同,此时不需要采样。或者其中一个类样本数为0的情况,但用户的问题应该排除了这种情况。另外,是否需要设置随机种子以保证可重复性,用户可能需要在代码中添加random_state参数。
可能的代码示例:
比如,原数据是train,假设Outcome列是目标变量。首先分离正负样本:
positive = train[train['Outcome'] == 1]
negative = train[train['Outcome'] == 0]
然后确定最小数量:
n = min(len(positive), len(negative))
对正类和负类各取n个样本:
positive_sampled = positive.sample(n, random_state=42)
negative_sampled = negative.sample(n, random_state=42)
合并:
balanced_df = pd.concat([positive_sampled, negative_sampled], axis=0)
然后打乱数据,避免顺序影响:
balanced_df = balanced_df.sample(frac=1, random_state=42).reset_index(drop=True)
接下来划分X和y:
X = balanced_df.drop('Outcome', axis=1)
y = balanced_df['Outcome']
然后划分训练集和测试集:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
这样就能保证在划分后的数据集中,正负样本比例仍然是1:1。
另外,用户提到“样本均衡处理”,可能需要使用其他方法,比如SMOTE过采样,但根据用户的需求,似乎只需要简单的欠采样即可。因此,这里应该使用上述方法。
还需要注意,如果原始数据中正负样本比例差异过大,欠采样可能会导致数据量减少,可能影响模型性能,但用户明确要求1:1的比例,所以必须这么做。
最后,模型训练部分,用户可能已经有了模型代码,只需要将处理后的数据传入即可。</think>### 分步解答
要实现从数据集中按`Outcome`列的正负样本1:1比例筛选数据,并进行模型训练,步骤如下:
---
#### **1. 数据准备与正负样本分离**
假设数据集存储在`DataFrame`中,列`Outcome`为二分类标签(1表示正类,0表示负类):
```python
import pandas as pd
from sklearn.model_selection import train_test_split
# 假设原始数据集为 df
df = pd.read_csv("your_dataset.csv")
# 分离正负样本
positive = df[df["Outcome"] == 1]
negative = df[df["Outcome"] == 0]
```
---
#### **2. 按1:1比例采样**
通过随机欠采样使正负样本数量一致:
```python
# 取正负样本中较小的数量作为基准
n_samples = min(len(positive), len(negative))
# 随机采样(可设置 random_state 保证可重复性)
positive_sampled = positive.sample(n_samples, random_state=42)
negative_sampled = negative.sample(n_samples, random_state=42)
# 合并为均衡数据集
balanced_df = pd.concat([positive_sampled, negative_sampled], axis=0)
balanced_df = balanced_df.sample(frac=1, random_state=42).reset_index(drop=True) # 打乱顺序
```
---
#### **3. 划分训练集与测试集**
使用`train_test_split`时,通过`stratify`参数保持分层抽样:
```python
X = balanced_df.drop("Outcome", axis=1)
y = balanced_df["Outcome"]
# 划分训练集和测试集(比例可调)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
stratify=y, # 保持正负样本比例
random_state=42
)
```
---
#### **4. 模型训练示例**
使用逻辑回归模型进行训练:
```python
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
print("模型准确率:", model.score(X_test, y_test))
```
---
### 关键点说明
- **欠采样**:通过减少多数类样本数量实现平衡,适用于数据量较大的场景。若数据量不足,可改用过采样(如SMOTE)[^1]。
- **stratify参数**:确保训练集和测试集的正负样本比例与原数据集一致,避免评估偏差[^2]。
---
阅读全文
相关推荐


















