【问题标题】:Prediction After One-hot encodingOne-hot 编码后的预测
【发布时间】:2019-07-14 03:19:24
【问题描述】:

我正在尝试使用示例数据框:

data = [['Alex','USA',0],['Bob','India',1],['Clarke','SriLanka',0]]

df = pd.DataFrame(data,columns=['Name','Country','Traget'])

现在从这里开始,我使用 get_dummies 将字符串列转换为整数:

column_names=['Name','Country']  

one_hot = pd.get_dummies(df[column_names])  

转换后的列是: 年龄,Name_Alex,Name_Bob,Name_Clarke,Country_India,Country_SriLanka,Country_USA

切片数据。

x=df[["Name_Alex","Name_Bob","Name_Clarke","Country_India","Country_SriLanka","Country_USA"]].values  

y=df['Age'].values

在训练和测试中拆分数据集

from sklearn.cross_validation import train_test_split

x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=float(0.5),random_state=0)

逻辑回归

from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression()

logreg.fit(x_train, y_train)

现在,模型已经训练完毕。

对于预测,假设我想通过给出“名称”和“国家”来预测“目标”。
喜欢:["Alex","USA"]。

预测。

如果我用这个:

logreg.predict([["Alex","USA"]).    

显然它不会起作用。

问题1)在训练过程中应用one-hot encoding后如何测试预测?

问题2)如何对仅包含“名称”和“国家/地区”的示例 csv 文件进行预测?

【问题讨论】:

  • 首先,每个线程只能发布一个问题。二、你的问题最适合Data Science Stack Exchange。
  • 您的模型需要对应于["Name_Alex","Name_Bob","Name_Clarke","Country_India","Country_SriLanka","Country_USA"] 的数组输入。您必须阅读您的示例 csv 文件,然后将其塑造成这种形状的数组,然后调用 logreg.predict(my_array)

标签: python pandas machine-learning one-hot-encoding


【解决方案1】:

我建议你使用 sklearn 标签编码器和一个热门的编码器包,而不是 pd.get_dummies。

一旦您初始化标签编码器和每个特征一个热编码器,然后将其保存在某处,这样当您想要对数据进行预测时,您可以轻松导入保存的标签编码器和一个热编码器并再次编码您的特征。

通过这种方式,您可以再次以与制作训练集时相同的方式对特征进行编码。

下面是我用来保存编码器的代码:

labelencoder_dict = {}
onehotencoder_dict = {}
X_train = None
for i in range(0, X.shape[1]):
    label_encoder = LabelEncoder()
    labelencoder_dict[i] = label_encoder
    feature = label_encoder.fit_transform(X[:,i])
    feature = feature.reshape(X.shape[0], 1)
    onehot_encoder = OneHotEncoder(sparse=False)
    feature = onehot_encoder.fit_transform(feature)
    onehotencoder_dict[i] = onehot_encoder
    if X_train is None:
      X_train = feature
    else:
      X_train = np.concatenate((X_train, feature), axis=1)

现在我保存这个 onehotencoder_dict 和标签 encoder_dict 并在以后使用它进行编码。

def getEncoded(test_data,labelencoder_dict,onehotencoder_dict):
    test_encoded_x = None
    for i in range(0,test_data.shape[1]):
        label_encoder =  labelencoder_dict[i]
        feature = label_encoder.transform(test_data[:,i])
        feature = feature.reshape(test_data.shape[0], 1)
        onehot_encoder = onehotencoder_dict[i]
        feature = onehot_encoder.transform(feature)
        if test_encoded_x is None:
          test_encoded_x = feature
        else:
          test_encoded_x = np.concatenate((test_encoded_x, feature), axis=1)
  return test_encoded_x

【讨论】:

  • 虽然这可能有效,但我建议利用 sklearn 的 pipeline 功能。使用管道对象,您还可以访问管道中每个估算器和转换器的参数。
  • 我尝试了上述解决方案,但得到 TypeError: unhashable type。在“feature = label_encoder.fit_transform(X[:,i])”处。
  • 我认为您没有传递正确类型的 X 作为输入。在我的情况下,我将 pandas 的列转换为这样的数组。 X = training_data[['feature1','feature2']].values 和 X = X.astype('str')
  • 太棒了!!。为我工作
  • 另请注意,您不再需要在OneHotEncoder之前使用LabelEncoder;后者可以直接应用于字符串数据。此外,OneHotEncoder 可以一次应用于多个列,因此无需循环并手动保存字典。 +1 来自@Quickbeam2k1 的管道建议。
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2020-09-18
  • 2019-11-18
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多