使用scikit-learn在one-hot-encoding后设置一个序列的数组元素



我一直在使用scikit-learn的线性svc模型来解决一个二元分类问题。

数据集中的示例行:

PassengerId Survived    Pclass  Name                    Sex    Age  SibSp   Parch   Ticket      Fare    Cabin   Embarked
0   1           0           3       Braund, Mr. Owen Harris male    22.0    1   0       A/5 21171   7.25    NaN     S

我使用scikit-learn中的OneHotEncoder和ColumnTransformer将数据转换为数字:

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
categorical_features = ["Name", "Sex", "Ticket", "Cabin", "Embarked"]
encoder = OneHotEncoder()
transformer = ColumnTransformer([("one_hot",
encoder,
categorical_features)],
remainder="passthrough")
transformed_X = transformer.fit_transform(X)
transformed_X

它返回给我一个scipy.sparse._csr。csr_matrix,所以我使用:

将其更改为数据框:
transformed_X = pd.DataFrame(transformed_X)

然后我重新拆分数据并使其适合模型

transformed_X_train, transformed_X_test, y_train, y_test = train_test_split(transformed_X,
      y,
      test_size=0.2)
from sklearn import svm
clf = svm.SVC()
clf.fit(transformed_X_train, y_train)

不幸的是,我得到一个错误:

TypeError                                 Traceback (most recent call last)
TypeError: float() argument must be a string or a real number, not 'csr_matrix'
...
ValueError: setting an array element with a sequence.

我试着在网上搜索,但我没有找到一个很好的解决我的问题。有人能帮帮我吗,因为我不知道我做错了什么。任何帮助都将是感激的:)

我明白了!在编码之前,我首先填充了数据框中缺失的数据,然后当我对它进行单热编码时,我对整个训练集进行了编码,而不仅仅是X,像这样:

transformed_X = transformer.fit_transform(train)
transformed_X

X与完整训练集的区别在于,X是没有目标值的训练集(在这种情况下,是它们是否存活)。

谢谢!:)

最新更新