SciKit LogisticRegression无法准确预测

时间:2019-03-01 19:11:42

标签: python machine-learning scikit-learn

我有一组生成的数据,用于描述CSV中的Web连接,如下所示:

conn_duration,conn_destination,response_size,response_code,is_malicious
1564,130,279,532,302,0
1024,200,627,1032,307,0
2940,130,456,3101,201,1

完整CSV here

该类根据持续时间,destination_id和响应代码指示感兴趣的对象。

我认为LogisticRegression在这里很合适,但是我得到的结果并不理想。在生成的数据集上,我有750行0类和150行1类。

这就是我处理和提供数据的方式:

names = ['conn_duration', 'conn_destination', 'response_size', 'response_code', 'is_malicious']
dataframe = pandas.read_csv(path, names=names)
array = dataframe.values

# separate array into input and output components
X = array[:,0:4]
y = array[:,4]

scaler = Normalizer().fit(X)
normalizedX = scaler.transform(X)

# summarize transformed data
numpy.set_printoptions(precision=3)
print(normalizedX[0:5,:])

model = LogisticRegression()
model.fit(X, y)

# Two test bits of data, expect the first to be predicted 1 and the second to be 0
Xnew = [[[3492, 150, 750, 200]], [[3492, 120, 901, 200]]]

for conn in Xnew:
    # make a prediction
    ynew = model.predict(conn)
    print("X=%s, Predicted=%s" % (conn[0], ynew[0]))

恶意流量的标准是响应代码为200,conn_destination为150,响应大小大于500。

我得到了合理的预测,但想知道LogisticRegression是否是使用的正确算法?

TIA!

3 个答案:

答案 0 :(得分:1)

如果代码正常工作,但是您不确定要使用哪种算法,则建议您尝试使用SVM,随机森林等。使用GridSearchCV模块来确定哪种算法可以提供最佳性能。 / p>

答案 1 :(得分:1)

由于有一个简单的规则可以对流量进行分类,例如“响应代码为200,conn_destination为150,并且响应大小大于500”,因此实际上不需要模型即可解决。不要夸大一个简单的问题。

出于研究目的还可以,但是模型应该非常接近100%,因为它应该学习此规则。

无论如何,conn_destination和response_code是分类数据,如果直接对其进行归一化,则算法会将200理解为更接近201的值,然后理解为300的值,但是它们将分类的不是数字。

以下是威胁分类数据的一些方法的参考:Linear regression analysis with string/categorical features (variables)?

答案 2 :(得分:1)

我会尝试XGBoost(极端梯度增强树)。在大型数据集中,SVM的计算成本很高,当您具有高度不平衡的数据集时,我特别喜欢随机森林。

如果要开发更准确,更复杂的工具(例如调整超参数,避免过度拟合并增加泛化属性),逻辑回归可以是神经网络的一部分。您还可以在XGBoost中通过修剪树来做到这一点。

对于分类问题,我会选择XGBoost和神经网络。但整个事情比那更大。这不是要选择一种算法,而是要了解其工作原理,幕后工作以及如何以可以准确预测类的方式对其进行调整。

此外,数据准备,变量选择,离群值检测,描述性统计对于模型的质量和准确性也非常重要。