【问题标题】:Passing single row of dictionary to predict with decision tree model使用决策树模型传递单行字典进行预测
【发布时间】:2021-09-12 18:14:09
【问题描述】:

我有这个简单的决策树模型以及预处理

merged_df = pd.read_excel(r'C:\Users\Kiwi\Downloads\data set balance.xlsx')

list_object = ['NAMA', 'TARGET', 'NIM']

merged_df['NIM'] = merged_df['NIM'].apply(str)

num_columns = merged_df.select_dtypes(include=['float64']).columns
cat_columns = merged_df.select_dtypes(include=['object']).drop(list_object, axis=1).columns

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('label', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, num_columns),
        ('cat', categorical_transformer, cat_columns)])

X = merged_df.drop(['TARGET','NIM','NAMA','NO.'],1)
y = merged_df['TARGET']

X_train = X
y_train = y

rf = Pipeline(steps=[('preprocessor', preprocessor),
                         ('classifier',tree.DecisionTreeClassifier(
                             class_weight='balanced', criterion='entropy'))])

rf.fit(X_train, y_train)

print('fitted')

X_test = {'Pendidikan Kewarganegaraan': 'C',
 'Pendidikan Agama dalam TIK': 'A-',
 'Kepemimpinan dan Pengembangan Karakter': 'A-',
 'Bahasa Indonesia untuk TI': 'B-',
 'Matematika Diskrit': 'A-',
 'Pengantar Multimedia': 'A',
 'Algoritma dan Pemrograman': 'B',
 'Rekayasa Perangkat Lunak': 'A',
 'Jaringan Komputer dan Komunikasi': 'A-',
 'Aljabar Linier': 'A-',
 'Struktur Data': 'A-',
 'Sistem Basis Data': 'B',
 'IP_smt1': 2.78,
 'IP_smt2': 3.16,
 'IP_smt3': 2.85,
 'IP_smt4': 3.41,
 'IP_smt5': 2.83,
 'IP_smt6': 3.37,
 'IP_smt7': 3.6,
 'IP_s8': 3.16,
 'IPK': 3.145
}

pred = rf.predict([X_test])

我正在尝试将单行字典(X_test)传递给模型,但它返回错误提示

ValueError: Expected 2D array, got 1D array instead:Reshape your data either 
using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

我不确定是否可以这样做,但根据文档,它说 predict 接受像输入一样的数组,但 dict 也不能​​重塑。有没有办法解决这个问题或者这是不可能的?

the data if you'd like to see

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    我通过简单地将括号添加到 X_test 来解决此问题

    X_test = [
    {'Pendidikan Kewarganegaraan': 'C',
     'Pendidikan Agama dalam TIK': 'A-',
     'Kepemimpinan dan Pengembangan Karakter': 'A-',
     'Bahasa Indonesia untuk TI': 'B-',
     'Matematika Diskrit': 'A-',
     'Pengantar Multimedia': 'A',
     'Algoritma dan Pemrograman': 'B',
     'Rekayasa Perangkat Lunak': 'A',
     'Jaringan Komputer dan Komunikasi': 'A-',
     'Aljabar Linier': 'A-',
     'Struktur Data': 'A-',
     'Sistem Basis Data': 'B',
     'IP_smt1': 2.78,
     'IP_smt2': 3.16,
     'IP_smt3': 2.85,
     'IP_smt4': 3.41,
     'IP_smt5': 2.83,
     'IP_smt6': 3.37,
     'IP_smt7': 3.6,
     'IP_s8': 3.16,
     'IPK': 3.145
    }]
    

    然后我把它变成dataframe

    X_test = pd.DataFrame(X_test)
    

    并将其传递给预测。有效

    【讨论】:

      【解决方案2】:

      您当前传递rf.predict([X_test]) 输入的方式本质上是说[X_test] 是一个列表,其中一行是您的字典X_test。如果您想简单地将字典的值传递给rf.predict(),您可以迭代X_test 的键并附加到一个列表中。

          # import at top of module
          import numpy as np 
      
          list_x = []
          for key in X_test:
              list_x.append(X_test[key])
          
          # convert to array
          array_x = np.array(list_x)
      
          # reshape
          array_x = np.reshape(array_x, (-1, 1))
          rf.predict(array_x)
      

      编辑:我犯了一个错误,在 np.reshape() 方法中省略了括号。已更新以包含正确的语法。

      【讨论】:

      • 你的意思是array_x.shape = np.reshape(len(array_x), 1)?同样,当传递给预测时,它会引发错误IndexError: tuple index out of range
      • 我找到了一个可能有用的线程。我相信你可以直接使用array_x = np.reshape(array_x, (-1, 1)),然后调用rf.predict(array_x)。重塑不会“就地”发生,因此您需要更新该值。我还更新了np.reshape() 的语法。我不小心漏掉了第一个论点。 stackoverflow.com/questions/46638641/…
      猜你喜欢
      • 1970-01-01
      • 2020-02-22
      • 2015-06-16
      • 2016-03-11
      • 2013-07-11
      • 2013-12-21
      • 2019-04-03
      • 2018-09-11
      • 2020-08-24
      相关资源
      最近更新 更多