用决策树模型通过单列字典进行预测

2024-06-17 05:53:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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_测试)传递给模型,但它返回的错误是

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


Tags: columnsiptargetdfdatapipelineobjecttrain
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.reformate()方法中遗漏了括号。已更新以包含正确的语法

我通过简单地在X_测试中添加括号修复了这个问题

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)

并通过它来预测。它起作用了

相关问题 更多 >