- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读到this关于 scikit 中新事物的博客。 OneHotEncoder
获取字符串似乎是一个有用的功能。下面是我尝试使用这个的
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_df = pd.read_csv('../../data/train.csv', usecols=cols)
test_df = pd.read_csv('../../data/test.csv', usecols=[e for e in cols if e != 'Survived'])
train_df.dropna(inplace=True)
test_df.dropna(inplace=True)
X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test = test_df.copy()
ct = ColumnTransformer([("onehot", OneHotEncoder(sparse=False), ['Sex', 'Embarked'])], remainder='passthrough')
X_train_t = ct.fit_transform(train_df)
X_test_t = ct.fit_transform(test_df)
print(X_train_t[0])
print(X_test_t[0])
# [ 0. 1. 0. 0. 1. 0. 3. 22. 1. 0. 7.25]
# [ 0. 1. 0. 1. 0. 3. 34.5 0. 0. 7.8292]
logreg = LogisticRegression(max_iter=5000)
logreg.fit(X_train_t, Y_train)
Y_pred = logreg.predict(X_test_t) # ValueError: X has 10 features per sample; expecting 11
acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
print(acc_log)
我在这段代码中遇到了以下 python 错误,并且我还有一些其他问题。
ValueError: X has 10 features per sample; expecting 11
从头开始..这个脚本是为 kaggle 的“泰坦尼克号”数据集编写的。我们有五个数值列 Pclass
、Age
、SibSp
、Parch
和 Fare
。 Sex
和 Embarked
列是类别 male/female
和 Q/S/C
(它是城市名称)。
我从 OneHotEncoder
了解到的是,它通过放置额外的列来创建虚拟变量。实际上,ct.fit_transform() 的输出现在不再是 pandas 数据帧,而是 numpy 数组。但从打印调试语句中可以看出,现在比原来的 7 列多了。
我遇到三个问题:
由于某种原因,test.csv
少了一列。这对我来说表明其中一个类别的选择较少。为了解决这个问题,我必须在训练+测试数据的类别中找到所有可用的选项。然后使用这些选项(例如male/female)分别对训练数据和测试数据进行转换。我不知道如何使用我正在使用的工具(pandas
、scikit
等)来执行此操作。再想一想..检查数据后我找不到 test.csv
中缺少的选项..
我想避免“dummy variable trap ”。现在看来创建的列太多了。我本来期待 1 栏用于性(总共选项 2 - 1 以避免陷阱)和 2 栏用于启动。加上额外的 5 个数字列,总共 8 个。
我不再识别转换的输出。我更喜欢一个新的数据框,其中新的虚拟列给出了自己的名称,例如 Sex_male (1/0) Embarked_Q (1/0) 和 Embarked_S(1/0)
我只习惯使用gretl
,虚拟化一个变量并省略一个选项是很自然的。我不知道在 python 中我是否做错了,或者这个场景是否不是标准 scikit 工具包的一部分。有什么建议吗?也许我应该为此编写一个自定义编码器?
最佳答案
我会尝试单独回答您的所有问题。
Answer for Question 1
在您的代码中,您在训练和测试数据上使用了 fit_transform
方法,这不是正确的方法。一般来说,fit_transform
仅应用于您的训练数据集,并返回一个转换器,然后仅用于转换
您的测试数据集。当您对测试数据应用 fit_transform
时,您只需使用仅在测试数据集中可用的分类变量的选项/级别来转换测试数据,并且您的测试数据很可能不包含所有分类变量的所有选项/级别,因此训练数据集和测试数据集的维度会有所不同,从而导致出现错误。
所以正确的做法是:
X_train_t = ct.fit_transform(X_train)
X_test_t = ct.transform(X_test)
Answer for Question 2
如果您想避免“虚拟变量陷阱”,您可以在创建 OneHotEncoder 时使用参数
对象在 drop
(将其设置为 first
) ColumnTransformer
中,这将导致只为 sex
创建一列,为 Embarked
创建两列,因为它们有两个 和分别三个选项/级别。
所以正确的做法是:
ct = ColumnTransformer([("onehot", OneHotEncoder(sparse=False, drop="first"), ['Sex','Embarked'])], remainder='passthrough')
Answer for Question 3
到目前为止,sklearn
中尚未实现可以使用新虚拟列重建数据框的 get_feature_names
方法。解决此问题的一种解决方法是将 ColumnTransformer
构造中的 reminder
更改为 drop
,并单独构造数据框,如下所示:
ct = ColumnTransformer([("onehot", OneHotEncoder(sparse=False, drop="first"), ['Sex', 'Embarked'])], remainder='drop')
A = pd.concat([X_train.drop(["Sex", "Embarked"], axis=1), pd.DataFrame(X_train_t, columns=ct.get_feature_names())], axis=1)
A.head()
这将导致类似这样的结果:
您的最终代码将如下所示:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_df = pd.read_csv('train.csv', usecols=cols)
test_df = pd.read_csv('test.csv', usecols=[e for e in cols if e != 'Survived'])
cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_df = train_df.dropna()
test_df = test_df.dropna()
train_df = train_df.reset_index(drop=True)
test_df = test_df.reset_index(drop=True)
X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test = test_df.copy()
categorical_values = ['Sex', 'Embarked']
X_train_cont = X_train.drop(categorical_values, axis=1)
X_test_cont = X_test.drop(categorical_values, axis=1)
ct = ColumnTransformer([("onehot", OneHotEncoder(sparse=False, drop="first"), categorical_values)], remainder='drop')
X_train_categorical = ct.fit_transform(X_train)
X_test_categorical = ct.transform(X_test)
X_train_t = pd.concat([X_train_cont, pd.DataFrame(X_train_categorical, columns=ct.get_feature_names())], axis=1)
X_test_t = pd.concat([X_test_cont, pd.DataFrame(X_test_categorical, columns=ct.get_feature_names())], axis=1)
logreg = LogisticRegression(max_iter=5000)
logreg.fit(X_train_t, Y_train)
Y_pred = logreg.predict(X_test_t)
acc_log = round(logreg.score(X_train_t, Y_train) * 100, 2)
print(acc_log)
80.34
当你执行X_train_t.head()
时,你会得到
关于python - 使用 pandas 和 scikit (OneHotEncoder) 虚拟化逻辑回归的分类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481354/
我有格式的数据,例如 ['1', '5' '6', '5', '2'],其中每个标签可以是 0-9 之间的任意数字的字符。我的数据的性质是名义上的分类,因此它是无序的,随后,我使用 scikit On
我有一个下面列出的原始序列数据帧,我正在尝试使用单热编码,然后将它们存储在一个新的数据帧中,我正在尝试使用以下代码进行操作,但无法存储,因为我得到了之后输出如下: 代码: onehot_encoder
我有多列由分类变量组成,这些变量的形式为 0-4 之间的整数值。但是,所有列都属于同一类别。我尝试使用 scikit learn 中的 OneHotEncoder,但它不会处理列中缺失的类别,这在我在
我有一个简单的代码,可以将分类数据转换为 python 中的一种热编码: a,1,p b,3,r a,5,t 我尝试使用 python OneHotEncoder 转换它们: from sklearn
我正在尝试准备数据以输入决策树和多项朴素贝叶斯分类器。 这就是我的数据的样子(pandas 数据框) Label Feat1 Feat2 Feat3 Feat4 0 1
在 sklearn 0.22 中,categorical_features 参数将被删除,因此以下代码不再可执行: import numpy as np from sklearn.preprocess
我希望将我仅有的一个特征转换为单独的二进制特征: df["pattern_id"] Out[202]: 0 3 1 3 ... 7440 2 7441 2 7442
我正在构建一个神经网络,并且正准备对许多独立(分类)变量使用 OneHotEncoder。我想知道我是否正在使用虚拟变量正确地处理这个问题,或者因为我的所有变量都需要虚拟变量,所以可能有更好的方法。
我是Python新手。我之前只有VBA代码。最近开始使用python进行数据挖掘,但使用python时遇到了问题 我在使用 onehotencoder 正确转换我的类别功能时遇到问题,这是我的代码 f
假设我有一个包含以下列名称的 pandas 数据框: '年龄'(例如 33、26、51 等) '资历'(例如'初级'、'高级'等) “性别”(例如“男”、“女”) '薪水'(例如 32000、4000
我有以下 numpy 矩阵: M = [ ['a', 5, 0.2, ''], ['a', 2, 1.3, 'as'], ['b', 1, 2.3, 'as'], ] M =
我是 Python 中 ML 的新手,对于如何使用分类变量实现决策树感到非常困惑,因为它们由 party 和 ctree 在 中自动编码R。 我想制作一棵具有两个分类独立特征和一个依赖类的决策树。 我
我有一个问题,我试图将转换应用于我的分类特征“国家”和我的其余数字列。我怎么能做到这一点,因为我在下面尝试: preprocess = make_column_transformer( (nu
我想对数据集中 10 个特征中的 3 个分类特征进行编码。我用 preprocessing来自 sklearn.preprocessing这样做如下: from sklearn import prep
该代码包括将 OneHotEncoding 技术应用于 binetflow 文件的两个字段:Proto 和 State。我必须对 5 个文件执行此操作。我能够将下面的代码完美地应用到前两个代码中。当到
我正在阅读有关 Python 中的 One Hot Encoding 的内容,其中有一行我无法解释其含义。代码如下: ohe=preprocessing.OneHotEncoder(dtype=np.
我正在使用sklearn.preprocessing.OneHotEncoder对表单的分类数据进行编码 A=array([[1,4,1],[0,3,2]]) B=array([[1,4,7],[0,
我在使用 OneHotEncoder 仅编码分类列并忽略连续列时遇到问题。无论我在 categorical_features 中指定什么,编码器都会对所有列进行编码。例如: enc = preproc
我有一个包含调查结果的数据框,其中有选项 A-E,并且可以选择多个选项 - 选择可以是“A”或“A;C;D”等。 我将使用这些数据进行一些机器学习,并希望通过 OneHotEncoder 运行它,最终
在使用 OneHotEncoder 转换特征后,我尝试对数据集中的某些特征进行一些数据分析,输出显示特征 13 和特征 21 是最重要的特征,但我如何知道这些特征对应哪些特征到? 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!