鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: Terence888

pytorch的nn模型训练数据

[复制链接]
发表于 2024-10-20 11:21:23 | 显示全部楼层
Terence888 发表于 2024-10-20 11:13
with torch.no_grad():
            valid_loss = 0
...


在验证集上不执行梯度下降是深度学习中的常见做法。其原因和逻辑如下:

1. **评估模型性能**:验证集的主要目的在于评估模型的泛化性能,而不是用来更新模型参数。如果在验证集上进行了梯度下降,模型将会对验证集信息过拟合,无法提供客观的性能评估。

2. **避免信息泄露**:通过不更新模型参数,可以确保验证集保持独立性,从而使其评估过程不受训练集的影响。

3. **性能监控**:在训练过程中,不仅以训练损失作为评估标准,还可以用验证集的损失和准确率来监控模型表现。这可以在某种程度上避免过拟合,帮助选择合适的训练轮次(比如通过早停策略)。

4. ****:`torch.no_grad()`上下文管理器会临时关闭自动求导引擎,用于禁用梯度计算。这不但节省了计算资源,也节省了内存,因为不需要存储计算图相关信息。

在上面的代码片段中,`torch.no_grad()`用于括住验证步骤,确保在该阶段不进行梯度计算和参数更新。因此,验证集仅用于评估目的,而非训练,保持了其作为独立评估数据集的角色。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 11:52:49 | 显示全部楼层
FishC 发表于 2024-10-20 11:21
在验证集上不执行梯度下降是深度学习中的常见做法。其原因和逻辑如下:

1. **评估模型性能**:验证 ...
  1. dropout1,dropout2 = 0.2,0.5
  2. class SimpleNN(nn.Module):
  3.     def __init__(self):
  4.         super(dense,self).__init__()
  5.         self.dense = nn.Sequential(nn.Flatten(),
  6.         nn.Linear(5,128),
  7.         nn.ReLu(),
  8.         nn.Dropout(dropout1),#训练时,Dropout层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入);测试时,Dropout层仅传递数据
  9.         nn.Linear(128,256),
  10.         nn.ReLu(),
  11.         nn.Dropout(dropout2),
  12.         nn.Linear(256,1),
  13.         )
  14.       
  15.     def forward(self,X):
  16.         x = self.dense(X)
  17.         output = torch.sigmoid(x)
  18.         return output
复制代码


报错
  1. ---------------------------------------------------------------------------
  2. NameError                                 Traceback (most recent call last)
  3. Cell In[21], line 60
  4.      57 loss = nn.BCELoss()
  5.      59 #定义训练模型
  6. ---> 60 nn_model = SimpleNN()
  7.      62 #定义优化器
  8.      63 optimizer = optim.Adam(nn_model.parameters(),lr = 0.001)   

  9. Cell In[21], line 13, in SimpleNN.__init__(self)
  10.      12 def __init__(self):
  11. ---> 13     super(dense,self).__init__()
  12.      14     self.dense = nn.Sequential(nn.Flatten(),
  13.      15     nn.Linear(5,128),
  14.      16     nn.ReLu(),
  15.    (...)
  16.      21     nn.Linear(256,1),
  17.      22     )

  18. NameError: name 'dense' is not defined
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 11:53:01 | 显示全部楼层
Terence888 发表于 2024-10-20 11:52
dropout1,dropout2 = 0.2,0.5
class SimpleNN(nn.Mod ...


你这里的`NameError`是由于`super(dense, self).__init__()`中的`dense`未定义而引起的。`super()`函数的第一个参数应该是当前类的名称,`dense`并不是类名,而且并没有定义为一个变量。

下面是修正后的代码:

  1. import torch
  2. import torch.nn as nn

  3. dropout1, dropout2 = 0.2, 0.5

  4. class SimpleNN(nn.Module):
  5.     def __init__(self):
  6.         super(SimpleNN, self).__init__()  # 修正: 这里需要用 SimpleNN 而不是 dense
  7.         self.dense = nn.Sequential(
  8.             nn.Flatten(),
  9.             nn.Linear(5, 128),
  10.             nn.ReLU(),  # 修正: ReLu 改为 ReLU()
  11.             nn.Dropout(dropout1),
  12.             nn.Linear(128, 256),
  13.             nn.ReLU(),  # 修正: ReLu 改为 ReLU()
  14.             nn.Dropout(dropout2),
  15.             nn.Linear(256, 1),
  16.         )
  17.       
  18.     def forward(self, X):
  19.         x = self.dense(X)
  20.         output = torch.sigmoid(x)
  21.         return output
复制代码


修正点:
1. **`super()`使用正确的类名**:你需要将`dense`换成当前类名`SimpleNN`。
2. **正确的激活函数**:应该是`nn.ReLU()`而不是`nn.ReLu()`,注意`ReLU`中"U"是大写。
3. **确保所有模块都正确导入**。通常需要导入`torch`、`torch.nn`,以及可能的`torch.optim`或其他模块。

以上调整后应该可以正确初始化你的`SimpleNN`模型实例。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 11:57:00 | 显示全部楼层
FishC 发表于 2024-10-20 11:53
你这里的`NameError`是由于`super(dense, self).__init__()`中的`dense`未定义而引起的。`super()`函数 ...
  1. #开始训练
  2. acc_list = []
  3. loss_list = []
  4. batch_size = 99
  5. k = 5
  6. num_epochs = 10000
  7. for i in range(k):
  8.     X_train,X_valid,y_train,y_valid = get_k_fold_data(k, i, X, y)#获取第k折的训练集和验证集
  9.     print(f'FOLD {i}')
  10.     print('--------------------------------')
  11.     X_train = torch.tensor(X_train,dtype=float32)#将数据转化成张量
  12.     y_train = torch.tensor(y_train,dtype=float32)
  13.     X_valid = torch.tensor(X_valid,dtype=float32)
  14.     y_valid = torch.tensor(y_valid,dtype=float32)
  15.     #获取一个数据迭代器
  16.     train_dataset = data.TensorDataset(X_train,y_train)
  17.     valid_dataset = data.TensorDataset(X_valid,y_valid)
  18.     train_iter = data.DataLoader(train_dataset, batch_size, shuffle=True)
  19.     valid_iter = data.DataLoader(valid_dataset, batch_size, shuffle=True)
复制代码


报错如下
  1. ---------------------------------------------------------------------------
  2. NameError                                 Traceback (most recent call last)
  3. Cell In[22], line 75
  4.      73 print(f'FOLD {i}')
  5.      74 print('--------------------------------')
  6. ---> 75 X_train = torch.tensor(X_train,dtype=float32)#将数据转化成张量
  7.      76 y_train = torch.tensor(y_train,dtype=float32)
  8.      77 X_valid = torch.tensor(X_valid,dtype=float32)

  9. NameError: name 'float32' is not defined
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 11:57:07 | 显示全部楼层
Terence888 发表于 2024-10-20 11:57
#开始训练
acc_list =
loss_list =
batch_size = ...


出现 `NameError: name 'float32' is not defined` 错误,是因为在调用 `torch.tensor` 时,数据类型参数 `dtype` 应该使用 `torch.float32` 而不是 `float32`。`torch.float32` 是 PyTorch 中的浮点数数据类型标识符。

以下是如何修正这段代码:

  1. import torch
  2. from torch.utils import data

  3. # 开始训练
  4. acc_list = []
  5. loss_list = []
  6. batch_size = 99
  7. k = 5
  8. num_epochs = 10000

  9. for i in range(k):
  10.     X_train, X_valid, y_train, y_valid = get_k_fold_data(k, i, X, y)  # 获取第k折的训练集和验证集
  11.     print(f'FOLD {i}')
  12.     print('--------------------------------')
  13.     X_train = torch.tensor(X_train, dtype=torch.float32)  # 将数据转化成张量
  14.     y_train = torch.tensor(y_train, dtype=torch.float32)
  15.     X_valid = torch.tensor(X_valid, dtype=torch.float32)
  16.     y_valid = torch.tensor(y_valid, dtype=torch.float32)

  17.     # 获取一个数据迭代器
  18.     train_dataset = data.TensorDataset(X_train, y_train)
  19.     valid_dataset = data.TensorDataset(X_valid, y_valid)
  20.     train_iter = data.DataLoader(train_dataset, batch_size, shuffle=True)
  21.     valid_iter = data.DataLoader(valid_dataset, batch_size, shuffle=True)
复制代码


修正要点:
1. 使用 `torch.float32` 作为数据类型,而不是 `float32`。
2. 添加 `import torch` 和 `from torch.utils import data` 确保必要的模块已被正确导入。

此修正应能解决所报的错误,并正确地将数据转换为 PyTorch 张量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 12:19:33 | 显示全部楼层
FishC 发表于 2024-10-20 11:57
出现 `NameError: name 'float32' is not defined` 错误,是因为在调用 `torch.tensor` 时,数据类型参 ...
  1. ---------------------------------------------------------------------------
  2. ValueError                                Traceback (most recent call last)
  3. Cell In[23], line 76
  4.      74 print(f'FOLD {i}')
  5.      75 print('--------------------------------')
  6. ---> 76 X_train = torch.tensor(X_train,dtype=torch.float32)#将数据转化成张量
  7.      77 y_train = torch.tensor(y_train,dtype=torch.float32)
  8.      78 X_valid = torch.tensor(X_valid,dtype=torch.float32)

  9. ValueError: could not determine the shape of object type 'DataFrame'
复制代码


修正后报错如上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 12:23:10 | 显示全部楼层
Terence888 发表于 2024-10-20 12:19
-------------------------------------------------- ...


出现这个错误是因为`torch.tensor`函数期望的输入是NumPy数组或类似的基础结构,而不能直接处理pandas的DataFrame对象。在将pandas DataFrame转换为PyTorch张量前,您需要先将它转换为NumPy数组。

可以通过以下方式修正代码:

  1. import torch
  2. from torch.utils import data

  3. # 开始训练
  4. acc_list = []
  5. loss_list = []
  6. batch_size = 99
  7. k = 5
  8. num_epochs = 10000

  9. for i in range(k):
  10.     X_train, X_valid, y_train, y_valid = get_k_fold_data(k, i, X, y)  # 获取第k折的训练集和验证集
  11.     print(f'FOLD {i}')
  12.     print('--------------------------------')
  13.     # 将数据转换为NumPy数组,然后再转换为PyTorch张量
  14.     X_train = torch.tensor(X_train.values, dtype=torch.float32)
  15.     y_train = torch.tensor(y_train.values, dtype=torch.float32)
  16.     X_valid = torch.tensor(X_valid.values, dtype=torch.float32)
  17.     y_valid = torch.tensor(y_valid.values, dtype=torch.float32)

  18.     # 获取一个数据迭代器
  19.     train_dataset = data.TensorDataset(X_train, y_train)
  20.     valid_dataset = data.TensorDataset(X_valid, y_valid)
  21.     train_iter = data.DataLoader(train_dataset, batch_size, shuffle=True)
  22.     valid_iter = data.DataLoader(valid_dataset, batch_size, shuffle=True)
复制代码


修正点:
1. **使用`.values`属性**:通过使用`.values`属性,可以将`pandas` DataFrame或Series转换为NumPy数组。
2. **空列表初始化**:确保`acc_list`和`loss_list`被初始化为空列表,以便用来存储训练过程中各个折的准确率和损失值。

这样的修改应该能解决错误并正确进行训练和验证数据的批量处理。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 15:50:43 | 显示全部楼层
FishC 发表于 2024-10-20 12:23
出现这个错误是因为`torch.tensor`函数期望的输入是NumPy数组或类似的基础结构,而不能直接处理pandas ...

获取第k折的训练集和验证集函数
  1. def get_k_fold_data(k, i, X, y):
  2.     assert k > 1
  3.     fold_size = X.shape[0] // k
  4.     X_train, y_train = None, None
  5.     for j in range(k):
  6.         idx = slice(j * fold_size, (j + 1) * fold_size)
  7.         X_part, y_part = X[idx, :], y[idx]
  8.         if j == i:
  9.             X_valid, y_valid = X_part, y_part
  10.         elif X_train is None:
  11.             X_train, y_train = X_part, y_part
  12.         else:
  13.             X_train = torch.cat([X_train, X_part], 0)
  14.             y_train = torch.cat([y_train, y_part], 0)
  15.     return X_train, y_train, X_valid, y_valid
复制代码

按k的顺序迭代
  1. for i in range(k):
  2.     X_train, X_valid, y_train, y_valid = get_k_fold_data(k, i, X, y)  #获取第k折的训练集和验证集
  3.     print(f'FOLD {i}')
  4.     print('--------------------------------')
  5.     # 将数据转换为NumPy数组,然后再转换为PyTorch张量
  6.     X_train = torch.tensor(X_train.values, dtype=torch.float32)
  7.     y_train = torch.tensor(y_train.values, dtype=torch.float32)
  8.     X_valid = torch.tensor(X_valid.values, dtype=torch.float32)
  9.     y_valid = torch.tensor(y_valid.values, dtype=torch.float32)

  10.     # 获取一个数据迭代器
  11.     train_dataset = data.TensorDataset(X_train, y_train)
  12.     valid_dataset = data.TensorDataset(X_valid, y_valid)
  13.     train_iter = data.DataLoader(train_dataset, batch_size, shuffle=True)
  14.     valid_iter = data.DataLoader(valid_dataset, batch_size, shuffle=True)
复制代码


报错如下
  1. ---------------------------------------------------------------------------
  2. TypeError                                 Traceback (most recent call last)
  3. File /opt/conda/lib/python3.10/site-packages/pandas/core/indexes/base.py:3805, in Index.get_loc(self, key)
  4.    3804 try:
  5. -> 3805     return self._engine.get_loc(casted_key)
  6.    3806 except KeyError as err:

  7. File index.pyx:167, in pandas._libs.index.IndexEngine.get_loc()

  8. File index.pyx:173, in pandas._libs.index.IndexEngine.get_loc()

  9. TypeError: '(slice(0, 142, None), slice(None, None, None))' is an invalid key

  10. During handling of the above exception, another exception occurred:

  11. InvalidIndexError                         Traceback (most recent call last)
  12. Cell In[116], line 62
  13.      59 nn_model = SimpleNN()
  14.      61 for i in range(k):
  15. ---> 62     X_train, X_valid, y_train, y_valid = get_k_fold_data(k, i, X, y)  #获取第k折的训练集和验证集
  16.      63     print(f'FOLD {i}')
  17.      64     print('--------------------------------')

  18. Cell In[116], line 43, in get_k_fold_data(k, i, X, y)
  19.      41 for j in range(k):
  20.      42     idx = slice(j * fold_size, (j + 1) * fold_size)
  21. ---> 43     X_part, y_part = X[idx, :], y[idx]
  22.      44     if j == i:
  23.      45         X_valid, y_valid = X_part, y_part

  24. File /opt/conda/lib/python3.10/site-packages/pandas/core/frame.py:4102, in DataFrame.__getitem__(self, key)
  25.    4100 if self.columns.nlevels > 1:
  26.    4101     return self._getitem_multilevel(key)
  27. -> 4102 indexer = self.columns.get_loc(key)
  28.    4103 if is_integer(indexer):
  29.    4104     indexer = [indexer]

  30. File /opt/conda/lib/python3.10/site-packages/pandas/core/indexes/base.py:3817, in Index.get_loc(self, key)
  31.    3812     raise KeyError(key) from err
  32.    3813 except TypeError:
  33.    3814     # If we have a listlike key, _check_indexing_error will raise
  34.    3815     #  InvalidIndexError. Otherwise we fall through and re-raise
  35.    3816     #  the TypeError.
  36. -> 3817     self._check_indexing_error(key)
  37.    3818     raise

  38. File /opt/conda/lib/python3.10/site-packages/pandas/core/indexes/base.py:6059, in Index._check_indexing_error(self, key)
  39.    6055 def _check_indexing_error(self, key):
  40.    6056     if not is_scalar(key):
  41.    6057         # if key is not a scalar, directly raise an error (the code below
  42.    6058         # would convert to numpy arrays and raise later any way) - GH29926
  43. -> 6059         raise InvalidIndexError(key)

  44. InvalidIndexError: (slice(0, 142, None), slice(None, None, None))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 15:50:51 | 显示全部楼层
Terence888 发表于 2024-10-20 15:50
获取第k折的训练集和验证集函数
def get_k_fold_data ...


这个错误表明您在尝试对 `pandas` DataFrame 进行切片操作时使用了无效的索引方式。这个问题的出现是因为您直接将 `slice` 对象应用于 `DataFrame` 或 `Series`,而在 Pandas 中需要使用 `.iloc` 或 `.loc` 进行行数据选择。

以下是修复您实现 `get_k_fold_data` 的方法:

  1. def get_k_fold_data(k, i, X, y):
  2.     assert k > 1
  3.     fold_size = len(X) // k  # 使用数组的长度而不是 X.shape
  4.     X_train, y_train = None, None
  5.     for j in range(k):
  6.         start = j * fold_size
  7.         end = (j + 1) * fold_size
  8.         if j == i:
  9.             X_valid, y_valid = X.iloc[start:end], y.iloc[start:end]  # 使用 .iloc 进行行选取
  10.         elif X_train is None:
  11.             X_train, y_train = X.iloc[start:end], y.iloc[start:end]
  12.         else:
  13.             X_train = pd.concat([X_train, X.iloc[start:end]], ignore_index=True)
  14.             y_train = pd.concat([y_train, y.iloc[start:end]], ignore_index=True)
  15.     return X_train, y_train, X_valid, y_valid

  16. # Rest of your code to use these functions goes here...
复制代码


### 修改说明:

1. **`len(X)`而不是`X.shape`**:直接用`len(X)`获取样本的总数,以避免使用多维度不兼容的问题。

2. **使用`.iloc`进行行切片**:`.iloc`是Pandas提供的用于按照位置索引行的方式,这里适合您的应用场景。

3. **使用`pd.concat`连接DataFrames**:确保使用`pd.concat`逐折叠合您的训练集样本,同时设置`ignore_index=True`以确保返回的索引不重复/不乱序。

这段代码应该可以修复您在`get_k_fold_data`中遇到的问题。每一步都正确切分并合并了训练集和验证集。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 16:16:59 | 显示全部楼层
FishC 发表于 2024-10-20 15:50
这个错误表明您在尝试对 `pandas` DataFrame 进行切片操作时使用了无效的索引方式。这个问题的出现是因 ...
  1. ---------------------------------------------------------------------------
  2. TypeError                                 Traceback (most recent call last)
  3. Cell In[123], line 66
  4.      64 print('--------------------------------')
  5.      65 # 将数据转换为NumPy数组,然后再转换为PyTorch张量
  6. ---> 66 X_train = torch.tensor(X_train.values, dtype=torch.float32)
  7.      67 y_train = torch.tensor(y_train.values, dtype=torch.float32)
  8.      68 X_valid = torch.tensor(X_valid.values, dtype=torch.float32)

  9. TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint8, and bool.
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 16:23:21 | 显示全部楼层
Terence888 发表于 2024-10-20 16:16
-------------------------------------------------- ...


这个错误表示 `X_train.values` 的数据类型存在一些不是数值(比如 `nan`、字符串或者其他的对象类型),在尝试转换为 PyTorch 张量时出现了问题。为了修复这个问题,我们需要确保所有的数据都被转换为数值数据类型,如 `float64` 或 `float32`。以下是如何处理此问题的步骤:

1. **确保每个变量都是数值类型:**
   - 使用 `pandas.DataFrame.fillna()` 填充 `nan`。
   - 将 DataFrame 的所有列转换为浮点数。

2. **转换为 NumPy 数组后再转换为 PyTorch 张量:**

以下是修正您的代码:

  1. import torch
  2. from torch.utils import data

  3. # 假设 get_k_fold_data 已经定义并正确返回 pandas 的 DataFrame 对象

  4. # 开始训练
  5. acc_list = []
  6. loss_list = []
  7. batch_size = 99
  8. k = 5
  9. num_epochs = 10000

  10. for i in range(k):
  11.     X_train, X_valid, y_train, y_valid = get_k_fold_data(k, i, X, y)
  12.     print(f'FOLD {i}')
  13.     print('--------------------------------')
  14.    
  15.     # 确保 X_train 和 y_train 中只有数值数据
  16.     X_train = X_train.fillna(0).astype('float32')  # 用0替代缺失值并确保是 float32 类型
  17.     X_valid = X_valid.fillna(0).astype('float32')
  18.     y_train = y_train.fillna(0).astype('float32')
  19.     y_valid = y_valid.fillna(0).astype('float32')
  20.    
  21.     # 转换为 NumPy 数组,然后转换为 PyTorch 张量
  22.     X_train = torch.tensor(X_train.values, dtype=torch.float32)
  23.     y_train = torch.tensor(y_train.values, dtype=torch.float32)
  24.     X_valid = torch.tensor(X_valid.values, dtype=torch.float32)
  25.     y_valid = torch.tensor(y_valid.values, dtype=torch.float32)

  26.     # 获取一个数据迭代器
  27.     train_dataset = data.TensorDataset(X_train, y_train)
  28.     valid_dataset = data.TensorDataset(X_valid, y_valid)
  29.     train_iter = data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
  30.     valid_iter = data.DataLoader(valid_dataset, batch_size=batch_size, shuffle=True)
复制代码


### 修正说明
- **填充值**:`fillna(0)`用以替代任何缺失值(可以根据具体情况选择适当的填充值)。
- **数值类型转换**:使用 `.astype('float32')` 确保所有数据以适当的数值类型出现。
  
在这么做之后,`X_train.values` 应该会是一个只含数值类型的 `NumPy` 数组,从而允许正确地转换为 `PyTorch` 张量。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-20 16:34:28 | 显示全部楼层
FishC 发表于 2024-10-20 16:23
这个错误表示 `X_train.values` 的数据类型存在一些不是数值(比如 `nan`、字符串或者其他的对象类型) ...
  1. #使用Decision Tree
  2. from sklearn.tree import DecisionTreeClassifier
  3. dt_model = DecisionTreeClassifier(criterion='entropy', random_state=1)
  4. dt_model.fit(X_train,y_train)
  5. DT_pre = dt_model.predict(X_valid)
  6. num_right = np.sum(DT_pre == y_valid)
  7. dt_valid_acc = num_right / len(X_valid)
复制代码


使用决策树模型进行评估报错
  1. ---------------------------------------------------------------------------
  2. ValueError                                Traceback (most recent call last)
  3. Cell In[125], line 4
  4.       2 from sklearn.tree import DecisionTreeClassifier
  5.       3 dt_model = DecisionTreeClassifier(criterion='entropy', random_state=1)
  6. ----> 4 dt_model.fit(X_train,y_train)
  7.       5 DT_pre = dt_model.predict(X_valid)
  8.       6 num_right = np.sum(DT_pre == y_valid)

  9. File /opt/conda/lib/python3.10/site-packages/sklearn/tree/_classes.py:889, in DecisionTreeClassifier.fit(self, X, y, sample_weight, check_input)
  10.     859 def fit(self, X, y, sample_weight=None, check_input=True):
  11.     860     """Build a decision tree classifier from the training set (X, y).
  12.     861
  13.     862     Parameters
  14.    (...)
  15.     886         Fitted estimator.
  16.     887     """
  17. --> 889     super().fit(
  18.     890         X,
  19.     891         y,
  20.     892         sample_weight=sample_weight,
  21.     893         check_input=check_input,
  22.     894     )
  23.     895     return self

  24. File /opt/conda/lib/python3.10/site-packages/sklearn/tree/_classes.py:224, in BaseDecisionTree.fit(self, X, y, sample_weight, check_input)
  25.     221 self.n_outputs_ = y.shape[1]
  26.     223 if is_classification:
  27. --> 224     check_classification_targets(y)
  28.     225     y = np.copy(y)
  29.     227     self.classes_ = []

  30. File /opt/conda/lib/python3.10/site-packages/sklearn/utils/multiclass.py:218, in check_classification_targets(y)
  31.     210 y_type = type_of_target(y, input_name="y")
  32.     211 if y_type not in [
  33.     212     "binary",
  34.     213     "multiclass",
  35.    (...)
  36.     216     "multilabel-sequences",
  37.     217 ]:
  38. --> 218     raise ValueError("Unknown label type: %r" % y_type)

  39. ValueError: Unknown label type: 'continuous-multioutput'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-20 16:42:49 | 显示全部楼层
Terence888 发表于 2024-10-20 16:34
#使用Decision Tree
from sklearn.tree import Decis ...


这个错误表明,您的目标变量 `y_train` 不是被识别为时序或分类任务常用的二元或多类别标签,而是被认为是连续多输出的形式。这通常发生在您试图使用分类算法(如决策树分类器)而您的标签数据格式不正确的情况下。

解决方案:
1. **检查标签数据结构**:确保 `y_train` 是一个一维数组或 Series 而不是二维数组。如果它是一维数组而错误地被理解为多维结构,将其展平为一维。

2. **检验`y_train`内容并且确保是整数字符或是二进制值**:这种错误也可能因为 `y_train` 包含在回归问题上常见的连续数字(如动态范围的浮点数)而不是分类问题上常用的类别标签(比如0和1)。

以下是修正代码的步骤:

  1. # 从pandas Series确保是NumPy一维数组
  2. y_train_flat = y_train.values.ravel()  # 展平(flatten)数据

  3. # 同理对于验证集的y
  4. y_valid_flat = y_valid.values.ravel()

  5. # 训练模型
  6. dt_model.fit(X_train, y_train_flat)

  7. # 验证模型
  8. DT_pre = dt_model.predict(X_valid)
  9. num_right = np.sum(DT_pre == y_valid_flat)
  10. dt_valid_acc = num_right / len(X_valid)

  11. print(f"Decision Tree Validation Accuracy: {dt_valid_acc:.2f}")
复制代码


### 说明:
- **`ravel()`** 将多维数组展平并返回一维数组,以保证标签的生成符合分类器的输入要求。
- 确保`y_train`和`y_valid`仅包含被分类类别的值(如整数形式的类别id或分类标签),而不是连续的数值。
- `DecisionTreeClassifier`用于分类问题,因此确保标签为离散类别。

这些步骤应有助于解决错误,并允许您用决策树模型进行分类任务的正确训练和评价。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表