为什么我会得到AttributeError: ‘KerasClassifier’对象没有属性’model’?

这是我的代码,我只在最后一行y_pred = classifier.predict(X_test)得到了错误。错误信息是AttributeError: 'KerasClassifier'对象没有属性'model'

# 导入库import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn import datasetsfrom sklearn import preprocessingfrom keras.utils import np_utils# 导入数据集dataset = pd.read_csv('Data1.csv',encoding = "cp1252")X = dataset.iloc[:, 1:-1].valuesy = dataset.iloc[:, -1].values# 编码分类数据from sklearn.preprocessing import LabelEncoder, OneHotEncoderlabelencoder_X_0 = LabelEncoder()X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0])labelencoder_X_1 = LabelEncoder()X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])labelencoder_X_2 = LabelEncoder()X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])labelencoder_X_3 = LabelEncoder()X[:, 3] = labelencoder_X_3.fit_transform(X[:, 3])onehotencoder = OneHotEncoder(categorical_features = [1])X = onehotencoder.fit_transform(X).toarray()X = X[:, 1:]# 将数据集拆分为训练集和测试集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)# 特征缩放from sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)# 创建ANN!# 导入Keras库和包import kerasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom keras.wrappers.scikit_learn import KerasClassifierfrom sklearn.model_selection import cross_val_scoredef build_classifier():    # 初始化ANN    classifier = Sequential()    # 添加输入层和第一个隐藏层    classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 10))    classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu'))    classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))    classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])    return classifierclassifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 2)accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 1, n_jobs=1)mean = accuracies.mean()variance = accuracies.std()# 预测测试集结果import sklearny_pred = classifier.predict(X_test)y_pred = (y_pred > 0.5)# 制作混淆矩阵from sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)# 预测新观察值test = pd.read_csv('test.csv',encoding = "cp1252")test = test.iloc[:, 1:].valuestest[:, 0] = labelencoder_X_0.transform(test[:, 0])test[:, 1] = labelencoder_X_1.transform(test[:, 1])test[:, 2] = labelencoder_X_2.transform(test[:, 2])test[:, 3] = labelencoder_X_3.transform(test[:, 3])test = onehotencoder.transform(test).toarray()test = test[:, 1:]new_prediction = classifier.predict_classes(sc.transform(test))new_prediction1 = (new_prediction > 0.5)

回答:

因为你还没有对classifier进行拟合。要使classifier具有可用的模型变量,你需要调用

classifier.fit(X_train, y_train)

虽然你已经对classifier使用了cross_val_score(),并得到了准确率,但需要注意的关键点是,cross_val_score会克隆提供的模型并用于交叉验证折叠。因此,你的原始估计器classifier未被触及和未经训练。

你可以在我的另一个回答中看到cross_val_score的工作原理

所以请在y_pred = classifier.predict(X_test)行之前添加上述代码行,你就准备好了。希望这能解释清楚。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注