【问题标题】:Error when using LabelBinarizer for classification model将 LabelBinarizer 用于分类模型时出错
【发布时间】:2022-01-26 20:06:57
【问题描述】:

我正在尝试训练一个机器学习模型,它将一组特征(地点、最低价格、最高价格和平均租金)分类为特定的房屋类型(1BHK、2BHK、3BHK)。 1BHK的意思是有1间卧室、大厅和厨房的房子。所以我的目标有三个类(1BHK、2BHK、3BHK)。

如果我使用 LabelEncoder,我可以成功地训练模型。但是如果我使用 LabelBinarizer,我会得到以下错误:

ValueError: y should be a 1d array, got an array of shape (106,3) instead

Link to dataset

代码:

import pandas as pd
from sklearn.preprocessing  import OneHotEncoder, LabelEncoder,LabelBinarizer
from sklearn.metrics import confusion_matrix, accuracy_score
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

#convert labels/target to numeric
def convert_labels_to_num(data,method="LE"):
    if method=="LB":                
        lb=LabelBinarizer()     
        lb.fit(data["HouseType"])       
        data=lb.transform(data["HouseType"])
    elif method=="LE":      
        le=LabelEncoder()
        le.fit(data["HouseType"])
        data=le.transform(data["HouseType"])
    return data


#import dataset
data=pd.read_csv("rentdtls.csv",na_values=["-"])
print(data.head())

#==========================================
# Data pre-processing
#==========================================

#Handle NaN value
data=data.dropna()
data.info()
data_bkup=data
    
#Handle categorical value (INPUT FEATURES)
ohe=OneHotEncoder()
ohe.fit(data[["Locality"]])
data_new=ohe.transform(data[["Locality"]]).toarray()
data_newdf=pd.DataFrame(data=data_new,columns=ohe.get_feature_names_out())  
#remaining columns
df_price=data[["MinPrice","MaxPrice","AvgRent"]]
#to make it concat friendly     
df_price=df_price.reset_index(drop=True) 

#join input features
inp_feat=pd.concat([data_newdf,df_price],axis=1)

print("Input Features after pre-processing : \n", inp_feat)

# LE for LabelEncoder and LB for LabelBinarizer
label_method="LB"

#Convert label to numeric
if label_method=="LE":
    labels=convert_labels_to_num(data_bkup)
    data_final=pd.concat([inp_feat,pd.Series(labels)],axis=1) 
elif label_method=="LB":
    labels=convert_labels_to_num(data_bkup,"LB")
    data_final=pd.concat([inp_feat,pd.DataFrame(labels)],axis=1)

#Define X and y
if label_method=="LE":
    X=data_final.iloc[:,:-1]
    y=data_final.iloc[:,-1]
elif label_method=="LB":
    X=data_final.iloc[:,:-3]
    y=data_final.iloc[:,58:61]
    
#split data into Train and Test
train_x,test_x,train_y,test_y=train_test_split(X,y,test_size=0.2,random_state=2)

#Train the model
model=SVC()
model.fit(train_x,train_y)

#Predict TEST data
predict_test_y=model.predict(test_x)

#print metrics
print(confusion_matrix(predict_test_y,test_y))
print()
print("Accuracy Score : %.2f "%accuracy_score(predict_test_y,test_y))
print()

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    这与你的这部分代码有关

    X=data_final.iloc[:,:-3]
    y=data_final.iloc[:,58:61]
    

    您将三列作为 Y 传递,我猜这是因为您已经使用 BHK 创建了三个目标列。在 sklearn 中,应用预处理器之前的原始特征结构仍然存在。尝试传递与标签编码器相同的 X 和 y。

    【讨论】:

    • 如果我传递与 LabelEncoder 相同的 X 和 y,它可能会起作用,但我认为它只会学会识别 3BHK。而且我知道使用 LabelEncoder 会创建某种排名。所以我想试试LabelBinarizer。但它不起作用。我们需要以某种方式让 model.fit() 知道它是一个单一的目标,例如 (n_samples, n_classes)
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2019-12-29
    • 2018-04-04
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多