加载pickle模型后出现AttributeError:numpy.ndarray无predict方法求助
问题解决:AttributeError: 'numpy.ndarray' object has no attribute 'predict'
核心原因
你加载的model是numpy数组,而非训练好的sklearn逻辑回归模型实例,自然没有predict方法。这大概率是模型保存环节出错,误存了模型的某个numpy属性(比如系数coef_),而非整个模型对象。
修复步骤
1. 重新正确保存模型
找到当初训练模型的代码,确保保存的是完整的模型实例,而非模型的某一部分参数:
import pickle from sklearn.linear_model import LogisticRegression # 假设你已经完成模型训练 model = LogisticRegression() model.fit(X_train, y_train) # X_train是训练特征,y_train是标签 # 正确保存整个模型 with open('logistic_regression_model.pkl', 'wb') as f: pickle.dump(model, f)
2. 验证模型加载结果
重新加载模型后,打印类型确认是否为sklearn模型实例:
model = pickle.load(open('你的模型路径.pkl', 'rb')) print(type(model)) # 正常输出应为类似 <class 'sklearn.linear_model._logistic.LogisticRegression'>
3. 修正CountVectorizer的使用错误
你的预测函数里调用cv.fit([cleaned_text])是错误的:训练时的CountVectorizer是基于训练集拟合的特征空间,预测时必须复用这个拟合好的Vectorizer,否则特征维度不匹配,预测结果完全无效。
解决方法:
- 训练时同时保存拟合好的CountVectorizer:
# 训练时拟合CountVectorizer cv = CountVectorizer() X_train_vec = cv.fit_transform(X_train_text) # 保存Vectorizer with open('count_vectorizer.pkl', 'wb') as f: pickle.dump(cv, f) - 预测时加载已保存的Vectorizer,直接调用
transform:# 加载模型和Vectorizer model = pickle.load(open('logistic_regression_model.pkl', 'rb')) cv = pickle.load(open('count_vectorizer.pkl', 'rb')) # 预测函数修正 def predict(): email_text = "hello world" cleaned_text = fit_count_vectorizer(email_text) # 不要调用fit,直接用训练好的cv做transform email_features_array = cv.transform([cleaned_text]) prediction = model.predict(email_features_array) probability = model.predict_proba(email_features_array) if prediction[0] == 1: result = 'Phishing' probability_score = probability[0][1] * 100 print(result, probability_score) else: result = 'Legitimate' probability_score = probability[0][0] * 100 print(result, probability_score) predict()
内容的提问来源于stack exchange,提问作者Azizener
相关产品推荐
相关产品推荐

