SciKit LogisticRegression 无法准确预测

Posted

技术标签:

【中文标题】SciKit LogisticRegression 无法准确预测【英文标题】:SciKit LogisticRegression failing to predict accurately 【发布时间】:2019-07-23 20:33:18 【问题描述】:

我有一组生成的数据以 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!

【问题讨论】:

【参考方案1】:

我会尝试 XGBoost(Extreme Gradient Boosted Trees)。在大型数据集中,SVM 的计算成本很高,当您拥有高度不平衡的数据集时,我特别喜欢随机森林。

逻辑回归可以成为神经网络的一部分,如果您想开发更准确和复杂的东西,例如调整超参数、避免过度拟合和增加泛化属性。您也可以在 XGBoost 中通过修剪树来做到这一点。

XGBoost 和神经网络是我解决分类问题的选择。但整个事情比这更大。这与选择算法无关,而是要了解它的工作原理、幕后情况以及如何以准确预测类别的方式对其进行调整。

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

【讨论】:

【参考方案2】:

由于流量分类有一个简单的规则,如“response code 为 200,conn_destination 为 150,response size 大于 500”,因此您实际上不需要模型来解决它。不要过度解决一个简单的问题。

出于学习目的,没关系,但模型应该非常接近 100%,因为它应该学习这条规则。

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

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

【讨论】:

【参考方案3】:

如果代码可以运行,但您不确定要使用哪种算法,我建议您尝试使用 SVM、随机森林等。使用GridSearchCV 模块来确定哪种算法可以提供最佳性能。

【讨论】:

以上是关于SciKit LogisticRegression 无法准确预测的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中 LogisticRegression 上的 GridSearchCV

LogisticRegression scikit学习协变量(列)顺序对训练很重要

如何评估 scikit learn LogisticRegression 的成本函数?

在 scikit-learn 库中使用 sgd 求解器的 SGDClassifier 与 LogisticRegression

SciKit LogisticRegression 无法准确预测

逻辑回归模型中的内核 LogisticRegression scikit-learn sklearn