Python 使用分类数据进行回归时发现未知类别

Python 使用分类数据进行回归时发现未知类别,python,machine-learning,scikit-learn,rfe,Python,Machine Learning,Scikit Learn,Rfe,我正在用ScikitLearn和Python做线性回归。 我的数据有分类值,所以我使用了编码 df = df[['Lokacija','Kvadratura', 'Stanje', 'Kategorija', 'Grejanje', 'Ukupno spratova','Sprat','Ukupna cena']] encoder = ColumnTransformer(transformers=[ ('onehot', OneHotEncoder(), ['Loka

我正在用ScikitLearn和Python做线性回归。 我的数据有分类值,所以我使用了编码

df = df[['Lokacija','Kvadratura', 'Stanje', 'Kategorija',
         'Grejanje', 'Ukupno spratova','Sprat','Ukupna cena']]

encoder = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(), ['Lokacija', 'Stanje', 'Grejanje']),
    ('scale', StandardScaler(), ['Kvadratura','Kategorija', 'Ukupno spratova', 'Sprat'])],
     remainder='passthrough')

x = df.iloc[:,:-1]
x = encoder.fit_transform(x)
y = df.iloc[:,-1]
我想找到最佳数量的功能,所以我使用了
RFE

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)

for i in range(1,5):
    final_rfe = RFE(LinearRegression(), i)
    model = final_rfe.fit(x_train, y_train)

#ERROR IN LINE BELOW!

    input_par = encoder.transform(pd.DataFrame([{
                                                "Lokacija": 'Vracar', 
                                                'Kvadratura': 56,
                                                'Stanje': 'Novogradnja',
                                                'Grejanje': 'Centralno grejanje',
                                                'Ukupno spratova': 6,
                                                'Sprat': 3}]))

    my_prediction = model.prediction(input_par)
    reg_score = model.score(x_test, y_test)
    print(my_prediction[0], reg_score)
但当我这么做的时候,我犯了一个错误:

ValueError: Found unknown categories ['Vracar'] in column 0 during transform
我做错了什么?
我知道问题正在转变,但我不知道我做错了什么。

有两种可能的解决方案:

  • 列车/测试拆分期间进行分层:
    x\u列车,x\u测试,y\u列车,y\u测试=列车/测试拆分(x,y,测试大小=0.33,分层=df['Lokacija','Stanje','Grejanje'],随机状态=42)
  • 更改处理未知分类功能的方式:
    ('onehot',onehotcoder(handle_unknown='ignore'),['Lokacija','Stanje','Grejanje'])

您在
x
中的数据是否包含
Lokacija
具有
Vracar
值的行?如果编码器在
fit\u transform
中没有看到这一点,则以后无法对其进行转换。您可以使用
df[df[“Lokacija”]==“Vracar”]
检查
分层的含义和
处理未知的内容是什么?对于
分层
,数据以分层的方式进行分割,将其用作类标签。例如,您的数据集将以这样的方式进行拆分,
x_train
x_test
将包含
“Lokacija”、“Stanje”、“Grejanje”的所有可能值。对于
handle_unknown
-当在转换过程中遇到未知类别时,此功能的热编码列将全部为零。在逆变换中,未知类别将表示为无。