Keras钓鱼链接二分类模型预测始终输出同一类别问题求助
钓鱼链接CNN二分类模型预测异常排查
我正在开展钓鱼链接二分类项目,已提取链接特征并训练了一个Keras CNN二分类模型,训练准确率达0.92,但使用该模型预测时始终输出类别0,无法得到正确分类结果。相关代码如下:
#importing basic packages import pandas as pd import numpy as np #import xgboost import sys from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from SingleURLFeatureExtraction import addfeature from createcnn_model import create_model import argparse import math import time import copy import keras from keras.models import Sequential, Model from keras import initializers from keras import regularizers from keras.layers.core import Dense from keras.layers import Dropout, Embedding, Flatten, Activation, BatchNormalization from keras.layers import Conv2D, MaxPooling2D from keras import backend as K from keras.callbacks import ModelCheckpoint, EarlyStopping from keras.utils.np_utils import to_categorical #XGBoost Classification model #from xgboost import XGBClassifier #Loading the data #def detect_url(): #check url #url= 'http://zozo.jp/shop/bestpackingstore/?price=proper&p_ssy=2015&p_ssm=5&p_ssd=13&p_sey=2015&p_sem=5&p_sed=13&dstk=2' #url1="http://www.google.com" def build_model(): data0 = pd.read_csv('urldata.csv') batch_size_v = 64; epochs_v = 4; #Dropping the Domain column data = data0.drop(['Domain'], axis = 1).copy() # shuffling the rows in the dataset so that when splitting the train and test set are equally distributed data = data.sample(frac=1).reset_index(drop=True) #data.head() y = data['Label'] X = data.drop('Label',axis=1) print(X.transpose()) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 12) model = create_model() # instantiate the model model.fit(X_train, y_train, batch_size=batch_size_v, epochs=epochs_v, # only 2 epochs, for demonstration purposes verbose=1, validation_data=(X_test, y_test)) score = model.evaluate(X_test, y_test, verbose=1) return model feature_names = ['Domain', 'Have_IP', 'Have_At', 'URL_Length', 'URL_Depth','Redirection', 'https_Domain', 'TinyURL', 'Prefix/Suffix', 'DNS_Record', 'Web_Traffic', 'Domain_Age', 'Domain_End', 'iFrame', 'Mouse_Over','Right_Click', 'Web_Forwards', 'Label'] data1 = pd.read_csv("phishing.csv") data1 = pd.DataFrame(data1, columns= feature_names) data1 = data1.drop(['Domain'], axis = 1).copy() data1 = data1.drop(['Label'], axis = 1).copy() for i in range(0, 5000): x = data1.iloc[i] y = pd.DataFrame(x.values.reshape(1,16)) predict_x=model.predict(y) classes_x=np.argmax(predict_x,axis=1) print(classes_x)
排查方向
- 模型未实例化:代码仅定义了
build_model()函数,但未执行model = build_model()来训练并获取有效模型实例,直接调用model.predict()要么报错,要么使用随机初始化的模型,这类模型大概率会偏向输出训练集中占比更高的类别(比如类别0)。 - 预处理不一致:训练用
urldata.csv,预测用phishing.csv,需确认:- 两个数据集的特征列顺序完全匹配,
data1的特征顺序必须和训练集X的列顺序一致; - 训练时是否对特征做了归一化/标准化?如果有,预测时必须对
phishing.csv的特征执行完全相同的缩放操作,否则模型输入分布不一致会导致输出异常。
- 两个数据集的特征列顺序完全匹配,
- 模型与标签不匹配:
- 二分类场景下,若模型输出层用
softmax+多分类损失,但训练时标签是原始0/1值(未做to_categorical转换),会导致模型学习偏差;建议二分类改用sigmoid输出层+binary_crossentropy损失,预测时通过判断输出值是否大于0.5来划分类别,而非np.argmax。 - 检查
create_model()的输出层配置,确认是否和训练时的标签格式匹配。
- 二分类场景下,若模型输出层用
- 训练集类别不平衡:训练准确率0.92不代表模型泛化能力强,如果训练集中类别0占比极高(比如90%以上),模型会倾向于预测类别0来维持高准确率,需统计训练集的标签分布情况。
- 输入维度不匹配:CNN模型通常需要4D输入(样本数,高,宽,通道数),如果
create_model()定义的输入形状是(16,1)或(4,4,1)这类格式,而预测时输入是(1,16)的2D张量,模型无法正确处理,会输出固定类别。需将预测数据调整为和训练时一致的输入维度,比如y.values.reshape(1, 16, 1, 1)(根据模型实际输入要求调整)。
内容的提问来源于stack exchange,提问作者dragontim
相关产品推荐
相关产品推荐

