ColumnTransformer和train_test_split过程

3

我目前正在学习Scikit-learn(请不要责备我),对于ColumnTransformer、训练和预测的过程有些困惑。我的数据集包含性别、婚姻状况、毕业状态、贷款金额、收入等特征。数据集中有一些对象(字符串)和整数值,但我认为大多数是对象。

据我所知,在训练模型之前,我需要将对象转换为整数值,并使用ColumnTransformer进行转换。但是训练模型的过程让我有点困惑。这是我的当前代码:

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import make_column_transformer

df = pd.read_csv("loan_data.csv", sep=",")
df.replace("", np.nan, inplace=True)
df.dropna(inplace=True)
df = df.drop(columns=["Loan_ID"])

X = df.drop(columns=["LoanAmount"])
y = df["LoanAmount"]

loan_categories = ["Gender", "Married", "Dependents", "Education", "Self_Employed", "Property_Area", "Loan_Status"]
ohe = OneHotEncoder()

ct = make_column_transformer (
    (ohe, loan_categories),
    remainder="passthrough")

ct.fit_transform(X)

然后我对train_test_split感到困惑。我是应该在将X传递给fit_transform之前进行train_test_split,还是现在在定义ct之后进行?

我的其他代码看起来像这样:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42)

model = DecisionTreeClassifier()
model.fit(X_train, y_train)

predictions = model.predict(X_test)
score = accuracy_score(y_test, predictions)

你需要先对X进行fit_transform以便拆分集合的转换,否则你需要对每个集合进行fit_transform。所以,是的,你的代码是正确的。 - Jorge L.
我明白,但是在运行model.fit(X_train, y_train)时,我遇到了一个错误,该错误显示“无法将字符串转换为浮点数:'Male'” 。因此,我认为这表示一些分类值尚未转换为整数? - gimbaptopokki
如果只是进行OneHot编码,可以在将X传入训练测试分离器之前进行fit_transform。 - StupidWolf
我正在考虑这个问题,但我对OHE的理解还有点模糊。您会对整个X进行OHE,还是只对X中的对象列进行处理?至于Y,它不应该进行OHE吗? - gimbaptopokki
为什么不使用来自sklearn的CountVectorizer,它可以帮助您将字符串转换为对象。 - AliAlavi
1个回答

0

嗨,如果你想使用fit_transform,请尝试以下代码:

    X = df.drop(columns=["LoanAmount"])
    y = df["LoanAmount"]
cv = CountVectorizer(max_features = 5000,ngram_range=(1,128),min_df=2,analyzer='word')
    x = cv.fit_transform(X).toarray()
    print("X.shape = ",x.shape)
    print("y.shape = ",y.shape)
        
        
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2,random_state = 42)
        
        model = DecisionTreeClassifier()
        model.fit(X_train, y_train)
        
        predictions = model.predict(X_test)
        score = accuracy_score(y_test, predictions)

在调用fit_transform之前,我是否应该使用train_test_split进行数据拆分? 答案是不需要


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接