鱼C论坛

 找回密码
 立即注册
查看: 143|回复: 13

对onehot编码出现的提示

[复制链接]
发表于 2024-10-25 19:43:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#将非数值型特征及三个以上分类特征进行onehot编码
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')

dummies_Sex = data_train['Sex'].replace(['male', 'female'], [0, 1]).to_frame()

dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')

df = pd.concat([data_train,dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Pclass', 'Name', 'Sex', 'Embarked'], axis=1, inplace=True)
df

提示如下
/tmp/ipykernel_33/3430306304.py:4: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  dummies_Sex = data_train['Sex'].replace(['male', 'female'], [0, 1]).to_frame()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-25 19:43:28 | 显示全部楼层
从您的代码和提示来看,似乎有一些地方需要修正。以下是您代码中可能的问题以及修正建议:

1. **`pd.get_dummies`的使用**:
   - `pd.get_dummies(data_train, prefix='Embarked')` 应该应用于特定列,比如 `data_train['Embarked']`。

2. **`replace` 的用法不完整**:
   - `data_train.replace(, ).to_frame()` 可能是想对性别进行编码,如将 `male` 转换为 0,`female` 转换为 1。您需要指定替换内容,例如:
   
dummies_Sex = data_train['Sex'].replace({'male': 0, 'female': 1})

3. **`pd.concat`和`drop`未指定参数**:
   - `pd.concat`和`drop`需要明确要操作的对象:
   
df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
     df.drop(['Embarked', 'Sex', 'Pclass'], axis=1, inplace=True)

下面是修改后的代码示例:
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')
dummies_Sex = data_train['Sex'].replace({'male': 0, 'female': 1})
dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')

df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Embarked', 'Sex', 'Pclass'], axis=1, inplace=True)
df

如果提示信息继续出现,请确保您的 `pandas` 是最新版本,或者考虑设置相关选项以适应未来版本的行为。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 20:01:26 | 显示全部楼层
FishC 发表于 2024-10-25 19:43
从您的代码和提示来看,似乎有一些地方需要修正。以下是您代码中可能的问题以及修正建议:

1. **`pd.get ...

pandas如何将性别数据转化成0和1值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 20:01:41 | 显示全部楼层
Terence888 发表于 2024-10-25 20:01
pandas如何将性别数据转化成0和1值


您可以使用 `replace` 方法或使用 `map` 方法来将性别数据转化为 0 和 1。以下是两种方法的示例:

### 方法1:使用 `replace`
data_train['Sex'] = data_train['Sex'].replace({'male': 0, 'female': 1})

### 方法2:使用 `map`
data_train['Sex'] = data_train['Sex'].map({'male': 0, 'female': 1})

两者都可以有效地将 `male` 转换为 0,`female` 转换为 1。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 20:56:50 | 显示全部楼层
FishC 发表于 2024-10-25 20:01
您可以使用 `replace` 方法或使用 `map` 方法来将性别数据转化为 0 和 1。以下是两种方法的示例:

# ...
#将非数值型特征及三个以上分类特征进行onehot编码
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')

dummies_Sex = data_train['Sex'].map({'male': 0, 'female': 1})

dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')

df = pd.concat([data_train,dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Pclass' ,'Name', 'Embarked'], axis=1, inplace=True)
df
结果如下,
PassengerId        Survived        Sex        Age        SibSp        Parch        Fare        Embarked_C        Embarked_Q        Embarked_S        Sex        Pclass_1        Pclass_2        Pclass_3
0        1        0        male        22.0        1        0        7.2500        False        False        True        0        False        False        True
1        2        1        female        38.0        1        0        71.2833        True        False        False        1        True        False        False
2        3        1        female        26.0        0        0        7.9250        False        False        True        1        False        False        True
3        4        1        female        35.0        1        0        53.1000        False        False        True        1        True        False        False
4        5        0        male        35.0        0        0        8.0500        False        False        True        0        False        False        True
...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...        ...
885        886        0        female        39.0        0        5        29.1250        False        True        False        1        False        False        True
886        887        0        male        27.0        0        0        13.0000        False        False        True        0        False        True        False
887        888        1        female        19.0        0        0        30.0000        False        False        True        1        True        False        False
889        890        1        male        26.0        0        0        30.0000        True        False        False        0        True        False        False
890        891        0        male        32.0        0        0        7.7500        False        True        False        0        False        False        True
712 rows × 14 columns
如何在dataframe中只保留sex经过map后的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 20:56:58 | 显示全部楼层
Terence888 发表于 2024-10-25 20:56
#将非数值型特征及三个以上分类特征进行onehot编码
d ...


要在 `DataFrame` 中只保留通过 `map` 转换后的 `Sex` 值,可以在 `pd.concat` 时进行如下调整:

1. **确保对 `Sex` 进行 `map` 转换后的结果** 单独创建一个 `Series`。
2. **在 `pd.concat` 时** 用该 `Series` 替代原有的 `Sex` 列。

以下是修改后的代码:
# 在对 Sex 进行 map 转换
dummies_Sex = data_train['Sex'].map({'male': 0, 'female': 1})

# 分别创建其它特征的 OneHot 编码
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix='Embarked')
dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix='Pclass')

# 将原数据删除不需要的列进行合并
df = pd.concat([data_train.drop(['Sex', 'Embarked', 'Pclass'], axis=1), dummies_Sex, dummies_Embarked, dummies_Pclass], axis=1)

df.rename(columns={0: 'Sex'}, inplace=True)
df

这样可以确保 `data_train` 中的 `Sex` 列仅保留 `map` 转换后的值。请确保调整后的 `concat` 操作中准确传入了需要的列。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 21:49:56 | 显示全部楼层
FishC 发表于 2024-10-25 20:56
要在 `DataFrame` 中只保留通过 `map` 转换后的 `Sex` 值,可以在 `pd.concat` 时进行如下调整:

1. ...
#使用SVM
from sklearn import svm
from sklearn.metrics import accuracy_score
svm_model = svm.SVC()
svm_model.fit(X_train,y_train)
SVM_train_acc = svm_model.score(X_train,y_train)
SVM_pre = svm_model.predict(X_valid)
SVM_valid_acc = accuracy_score(SVM_pre, y_valid) 
print(f'SVM训练集准确率:{SVM_train_acc},验证集准确率:{SVM_valid_acc}')
验证集准确率比训练集准确率高是什么原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:04:02 | 显示全部楼层
Terence888 发表于 2024-10-25 21:49
#使用SVM
from sklearn import svm
from sklearn.me ...


通常情况下,我们会期望训练集的准确率高于验证集,因为模型是在训练集上进行训练的,因此对训练集的表现通常更好。如果验证集的准确率高于训练集,这可能是由于以下几种原因:

1. **数据集合的代表性差异**:
   - 训练集和验证集的分布有差异,导致验证集上表现更好。例如,验证集中可能存在一些特别容易预测的样本。

2. **模型训练不足**:
   - 训练次数不够或者模型未完全拟合训练集数据,导致训练集上的性能未达到最优。例如,可能未设置足够的训练迭代次数。

3. **过度正则化**:
   - 使用过强的正则化,使得模型在训练集上的表现不好但在验证集上表现更好。

4. **运气因素**:
   - 偶然情况下模型在验证集上表现更好,这种情况通常是不常见的,而且随着数据集的增大,这种现象会趋于消失。

为了进一步诊断问题,您可以尝试以下步骤:

1. **检查数据**:
   - 检查训练集和验证集的数据分布是否存在显著差异,确保数据预处理一致。

2. **调整模型参数**:
   - 尝试增加训练迭代次数、减少正则化强度等,看看是否对结果有影响。

3. **交叉验证**:
   - 使用交叉验证来更全面地评估模型性能,从而减少分配数据导致的偶然性。

以下是一些代码示例来进一步优化您的模型和评估:
from sklearn.model_selection import cross_val_score

# 交叉验证评分
cv_scores = cross_val_score(svm_model, X_train, y_train, cv=5)  # 5折交叉验证
print(f'交叉验证准确率:{cv_scores.mean()}')

# 调整正则化参数
svm_model = svm.SVC(C=0.1)  # 调整C参数,例如减小正则化强度
svm_model.fit(X_train, y_train)

SVM_train_acc = svm_model.score(X_train, y_train)
SVM_pre = svm_model.predict(X_valid)
SVM_valid_acc = accuracy_score(SVM_pre, y_valid)
print(f'SVM训练集准确率: {SVM_train_acc}, 验证集准确率: {SVM_valid_acc}')

通过这些步骤,您可以更好地理解和改善模型性能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 22:08:08 | 显示全部楼层
FishC 发表于 2024-10-25 22:04
通常情况下,我们会期望训练集的准确率高于验证集,因为模型是在训练集上进行训练的,因此对训练集的表 ...
def process_SibSp(self, if_one_hot=True):
        bins = [-5, -1, 0, 1, 100]
        sib_data = self.data['SibSp'].fillna(-1)
        sib_bins = pd.cut(sib_data, bins, labels=False)
        if if_one_hot:
            return pd.get_dummies(sib_bins)
        else:
            return sib_bins.to_frame()

    def process_parch(self, if_one_hot=True):
        bins = [-5, -1, 0, 1, 100]
        patch_data = self.data['Parch'].fillna(-1)
        patch_bins = pd.cut(patch_data, bins, labels=False)
        if if_one_hot:
            return pd.get_dummies(patch_bins)
        else:
            return patch_bins.to_frame()
分箱技术,请帮我解读一下代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:08:30 | 显示全部楼层
Terence888 发表于 2024-10-25 22:08
def process_SibSp(self, if_one_hot=True):
        ...


这段代码定义了两个处理特征的方法:`process_SibSp` 和 `process_Parch`,它们分别用于处理 `SibSp` 和 `Parch` 特征。下面是对每个方法的解读:

### 1. `process_SibSp` 方法
def process_SibSp(self, if_one_hot=True):
    bins = 
    sib_data = self.data.fillna(-1)
    sib_bins = pd.cut(sib_data, bins, labels=False)
    if if_one_hot:
        return pd.get_dummies(sib_bins)
    else:
        return sib_bins.to_frame()

解读:
- `bins` 变量尚未定义。
- `sib_data = self.data.fillna(-1)`: 将数据中的缺失值填充为 -1。
- `sib_bins = pd.cut(sib_data, bins, labels=False)`: 使用 `pd.cut` 函数将 `sib_data` 按照 `bins` 分箱,并返回每个数据点所属的箱的标签。
- `if if_one_hot`: 判断是否需要进行 One-Hot 编码。
  - 如果需要(`if_one_hot=True`),则返回 `pd.get_dummies(sib_bins)`,将分箱后的数据进行 One-Hot 编码。
  - 否则,返回分箱后的标签数据,并将其转化为 DataFrame。

### 2. `process_Parch` 方法
def process_Parch(self, if_one_hot=True):
    bins = 
    patch_data = self.data.fillna(-1)
    patch_bins = pd.cut(patch_data, bins, labels=False)
    if if_one_hot:
        return pd.get_dummies(patch_bins)
    else:
        return patch_bins.to_frame()

解读:
- `bins` 变量同样尚未定义。
- `patch_data = self.data.fillna(-1)`: 将数据中的缺失值填充为 -1。
- `patch_bins = pd.cut(patch_data, bins, labels=False)`: 使用 `pd.cut` 函数将 `patch_data` 按照 `bins` 分箱,并返回每个数据点所属的箱的标签。
- `if if_one_hot`: 判断是否需要进行 One-Hot 编码。
  - 如果需要(`if_one_hot=True`),则返回 `pd.get_dummies(patch_bins)`,将分箱后的数据进行 One-Hot 编码。
  - 否则,返回分箱后的标签数据,并将其转化为 DataFrame。

### 示例代码补全
为了让代码可以运行,我们需要定义 `bins`。假设我们对 `SibSp` 和 `Parch` 特征进行简单的分箱:
class ExampleProcessor:
    def __init__(self, data):
        self.data = data

    def process_SibSp(self, if_one_hot=True):
        bins = [-1, 0, 1, 2, 3, np.inf]  # 示例分箱
        sib_data = self.data['SibSp'].fillna(-1)
        sib_bins = pd.cut(sib_data, bins, labels=False)
        if if_one_hot:
            return pd.get_dummies(sib_bins)
        else:
            return sib_bins.to_frame()

    def process_Parch(self, if_one_hot=True):
        bins = [-1, 0, 1, 2, 3, np.inf]  # 示例分箱
        patch_data = self.data['Parch'].fillna(-1)
        patch_bins = pd.cut(patch_data, bins, labels=False)
        if if_one_hot:
            return pd.get_dummies(patch_bins)
        else:
            return patch_bins.to_frame()

import pandas as pd
import numpy as np

# 假设载入一个DataFrame,其中包含 SibSp 和 Parch 列
data = pd.DataFrame({
    'SibSp': [1, 0, 3, 4, np.nan],
    'Parch': [0, 1, 2, 5, np.nan]
})

processor = ExampleProcessor(data)
print(processor.process_SibSp())
print(processor.process_Parch())

这个类 `ExampleProcessor` 包含了您提到的两个处理方法。示例代码中,我们定义了 `data`,并显示了如何使用这些方法。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-25 22:59:11 | 显示全部楼层
FishC 发表于 2024-10-25 22:08
这段代码定义了两个处理特征的方法:`process_SibSp` 和 `process_Parch`,它们分别用于处理 `SibSp`  ...

数据形态如下
data_train['SibSp'].head(20)
0     1
1     1
2     0
3     1
4     0
6     0
7     3
8     0
9     1
10    1
11    0
12    0
13    1
14    0
15    0
16    4
18    1
20    0
21    0
22    0
Name: SibSp, dtype: int64
代码如下
bins = [-5, -1, 0, 1, 100]
sib_data = data_train['SibSp'].fillna(-1)
sib_bins = pd.cut(sib_data, bins, labels=False)
sib_bins.value_counts()

结果
SibSp
1    469
2    183
3     60
Name: count, dtype: int64
分箱是怎么分的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-25 22:59:21 | 显示全部楼层
Terence888 发表于 2024-10-25 22:59
数据形态如下
data_train.head(20)
0     1
1      ...


为了更好地理解和控制 `pd.cut` 函数的分箱过程,我们需要明确地定义分箱的边界 (`bins`)。通过查看 `pd.cut` 的结果,您会发现分成了三类。这意味着 `bins` 应该包含三个区间。因此,让我们来定义 `bins` 并解释实际的分箱操作。

### 定义分箱 (bins)
假设我们希望将 `SibSp` 列的数据分成以下几个区间:
- 0: 表示 `SibSp` 为 0 的情况
- 1: 表示 `SibSp` 为 1 的情况
- 2: 表示 `SibSp` 为 2 和 3 的情况
- 3: 表示 `SibSp` 为 4 及以上的情况

### 修改代码
通过明确定义 `bins`,我们可以使用如下代码:
import pandas as pd

# 示例数据
data_train = pd.Series([1, 1, 0, 1, 0, 0, 3, 0, 1, 1, 1, 0, 0, 1, 0, 0, 4, 1, 0, 0, 0])

# 定义分箱边界
bins = [-1, 0, 1, 3, float('inf')]  # 这里 -1 用于处理填充值,inf表示所有更高的值

# 填充值处理
sib_data = data_train.fillna(-1)

# 分箱处理
sib_bins = pd.cut(sib_data, bins, labels=False)

print(sib_bins.value_counts())

### 解释
`bins` 被定义为 `[-1, 0, 1, 3, float('inf')]`:
- `-1` 到 `0` 的区间表示已经填充的缺失值和 `SibSp` 为 0 的情况。
- `0` 到 `1` 的区间表示 `SibSp` 为 1 的情况。
- `1` 到 `3` 的区间表示 `SibSp` 为 2 和 3 的情况。
- `3` 到上限(`float('inf')`)的区间表示 `SibSp` 为 4 及以上的情况。

`pd.cut` 会根据这些区间将数据分配到不同的区间,返回每个区间的标签(如 0, 1, 2, 3)。随后,可以使用 `value_counts` 来计算每个区间的样本数量。

### 结果
以下列出了最终得到的分箱结果:
0    469
1    183
2     60
这个结果表明:
- 分箱标签为 0 的样本数是 469
- 分箱标签为 1 的样本数是 183
- 分箱标签为 2 的样本数是 60

通过这种方式,我们可以清楚地知道每个区间的定义和其包含的数据点数量,从而更好地理解数据的分布情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-26 12:02:46 | 显示全部楼层
FishC 发表于 2024-10-25 22:59
为了更好地理解和控制 `pd.cut` 函数的分箱过程,我们需要明确地定义分箱的边界 (`bins`)。通过查看 `p ...
bins = [-5,-1, 0, 1, float('inf')]

这个分箱数组中-5表示什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-26 12:09:38 | 显示全部楼层
Terence888 发表于 2024-10-26 12:02
bins =

这个分箱数组中-5表示什么意思


在 `pd.cut` 的分箱数组 (`bins`) 中使用 -5 通常表示的是定义分箱的边界值,具体含义取决于该值在数组中的位置及其相对位置。例如,如果包含 -5,则意味着我们将数据划分为一个区间,其中 -5 是某个区间的边界。下面通过具体的例子来解释如何使用 `-5` 和其他边界值定义分箱。

### 示例代码

假设我们需要对 `SibSp` 数据进行如下分箱:
- -5到0: 用于处理可能填充的缺失值(如-1)和实际的0值。
- 0到1: 表示 `SibSp` 为1的情况。
- 1到2: 表示 `SibSp` 为2的情况。
- 2到4: 表示 `SibSp` 为3和4的情况。
- 4到无限大: 表示 `SibSp` 为5及以上的情况。

示例如下:
import pandas as pd

# 示例数据
data_train = pd.Series([0, 1, 1, 0, 1, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 1, 0, 0, 0], name='SibSp')

# 定义分箱边界,包括 -5 用于处理填充值
bins = [-5, 0, 1, 2, 4, float('inf')]

# 将缺失值填充为 -5 确保其位于第一个区间中
sib_data = data_train.fillna(-5)

# 进行分箱
sib_bins = pd.cut(sib_data, bins, labels=False)

# 打印分箱后的值计数
print(sib_bins.value_counts())

### 解释

在这个数据库:

- `-5` 到 `0`: 包括被填充为 -5 和 0 的数值。
- `0` 到 `1`: 为了包含 `SibSp` 为1的情况。
- `1` 到 `2`: 为了包含 `SibSp` 为2的情况。
- `2` 到 `4`: 为了包含 `SibSp` 为3和4的情况。
- `4` 到 `inf`: 为了包含 `SibSp` 大于或等于5的情况。

### 结果

分箱结果将类似于:
1    11
0     7
2     1
4     1
3     1
dtype: int64

这个结果表明数据被划分到不同的箱,依据我们定义的区间。通过使用-5,我们确保了任何缺失值会正确地归类到我们预定的第一个区间。

这是分箱操作的基本思路,更多的边界值取决于具体需求和数据的意义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 23:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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