【发布时间】:2020-04-16 06:41:53
【问题描述】:
我在scikit 阅读了有关新事物的this 博客。 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 每个样本有 10 个特征;预计 11
从头开始......这个脚本是为来自 kaggle 的“泰坦尼克号”数据集编写的。我们有五个数字列Pclass、Age、SibSp、Parch 和Fare。 Sex 和 Embarked 列是类别 male/female 和 Q/S/C(这是城市名称的缩写)。
我从OneHotEncoder 了解到的是,它通过放置额外的列来创建虚拟变量。实际上ct.fit_transform() 的输出现在不再是pandas 数据帧而是numpy 数组。但是从打印调试语句中可以看出,现在已经超过了原来的 7 列。
我遇到了三个问题:
由于某种原因,
test.csv少了一列。这向我表明,其中一个类别的选择较少。为了解决这个问题,我必须在训练 + 测试数据的类别中找到所有可用选项。然后使用这些选项(例如男性/女性)分别转换训练和测试数据。我不知道如何使用我正在使用的工具(pandas、scikit等)来做到这一点。再三考虑..检查数据后,我在test.csv中找不到丢失的选项..我想避免使用“dummy variable trap”。现在似乎创建了太多列。我期待 1 列用于 Sex(总选项 2 - 1 以避免陷阱)和 2 用于登船。加上额外的 5 个数字列,总计 8 个。
我不再识别转换的输出。我更喜欢新的数据框,其中新的虚拟列已经给出了自己的名称,例如 Sex_male (1/0) Embarked_Q (1/0) 和 Embarked_S(1/0)
我只习惯于使用gretl,在那里对变量进行虚拟化并省略一个选项是很自然的。我不知道在 python 中我是否做错了,或者这种情况是否不是标准 scikit 工具包的一部分。有什么建议吗?也许我应该为此编写一个自定义编码器?
【问题讨论】:
标签: python pandas numpy machine-learning scikit-learn