滚球必杀;如何对其jvm模型调优进行参数调优?

4075人阅读
机器学习(14)
如果你对机器学习算法已经很熟悉了,但是有时候你的模型并没有很好的预测效果或者你想要追求更好地模型性能。那么这篇文章会告诉你一些最实用的技术诊断你的模型出了什么样的问题,并用什么的方法来解决出现的问题,并通过一些有效的方法可以让你的模型具有更好地性能。
介绍数据集
这个数据集有569个样本,它的前两列为唯一的ID号和诊断结果 (M = malignant, B = benign) ,它的3-&32列为实数值特征,我不是医学专家,我不太明白具体特征的是什么意思,都是关于细胞的,但是,机器学习的伟大之处就在于这点,即使我们不是一个这方面的专家,我们依然可以读懂这些数据,掌握数据中的模式,从而我们也可以像一个专家一样做出预测。
下面的链接有数据集更详细的介绍,有兴趣的朋友可以看看。
初识pipeline
在训练机器学习算法的过程中,我们用到了不同的数据预处理技术,比如:标准化,PCA等。在scikit-learn中,我们可以用pipeline这个非常方便的类帮我们简化这些过程。这个类帮我们用任意次的转换步骤来拟合模型并预测新的数据。下面,我用具体代码来演示这个类的好处:
import pandas as pd
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data', header=None)
from sklearn.preprocessing import LabelEncoder
X = df.loc[:, 2:].values
y = df.loc[:, 1].values
le = LabelEncoder()
y = le.fit_transform(y)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1)
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
estimators = [('scl', StandardScaler()), ('pca', PCA(n_components=2)), ('clf', LogisticRegression(random_state=1))]
pipe_lr = Pipeline(estimators)
pipe_lr.fit(X_train, y_train)
print(pipe_lr.score(X_test, y_test))
当我们调用Pipeline的fit方法时,StandardScaler调用fit和transform方法来将数据标准化,接着标准化后的数据被传到PCA中,PCA也执行fit和transform方法对标准化后的数据进行降维,最后把降维的数据用逻辑回归模型拟合,当然了,这只是我的一个演示,你可以把任意多的转换步骤放到Pipeline中。而且,它的另一个优点是,当我们评估测试集的时候,它也会用上面转换过程保留的参数来转换测试集。这一切是不是很Cool?Pipeline就像一个工厂流水线一样,把所有的步骤链接到了一起,具体的细节完全不用我们自己操心。整个流程可以用下面的图形概括。
用holdout和k-fold交叉验证评估模型性能
holdout交叉验证
在我们上面的那个例子中,我们只把数据集分成了训练集和测试集。然而在实际的机器学习应用中,我们会选择最优的模型和最优的学习参数来提高我们算法对未见到的数据预测的性能。然而,如果我们在模型选择或调节参数的过程中,一遍又一遍地用我们的测试集,那么它也变成了我们测试集的一部分了,很有可能这样的参数和模型只适应当前的测试集,而对没有见过的数据集它的性能很不好,也就是发生了过拟合现象。
因此,一个更好地方式是把我们的数据集分成三个部分:把上面例子中的训练集分成训练集和交叉验证集,测试集。现在,我们构建机器学习的系统步骤应该是:
选择模型和参数,用训练集去拟合
把拟合后的模型和参数应用到交叉验证集来评估其性能
不断地重复1,2两个过程,直到挑选出我们满意的模型和参数
用测试集去评估步骤3选出的模型,看它在未见过的数据上的性能
但是,holdout交叉验证有个缺点是:样本不同的训练集和交叉验证集会产生不同的性能评估。下面,让我们介绍k-fold交叉验证来解决这个问题。
k-fold交叉验证
在holdout交叉验证中,我们把训练集拆分成训练集和交叉验证集。在k-fold交叉验证中,我们把训练集拆分成k份,k-1份用作训练,1份用作测试。然后,我们把这k份中的每份都用来测试剩下的份用作训练,因此,我们会得到k个模型和性能的评估,最后求出性能的平均值。下面,我假设k=10,看下图:
上图中,我把训练集分成10份,在10次迭代中,9份被用作训练,1份被用作测试,最后我们求出平均性能。注意:在每次迭代中,我们并没有重新划分训练集,我们只是最初分成10份,接着在每次迭代中,用这10份中的每一份做测试剩下的9份用作训练。
对于大多数的应用k=10是个合理的选择。然而,如果我们的训练集相对较小,我们可以增加k值,因此,在每次迭代中我们将有更多的训练集来拟合模型,结果是我们对泛化的性能有更低地偏差。另一方面,如果我们有更大地数据集,我们可以选择一个更小地值k,即使k值变小了,我们依然可以得到一个对模型性能的准确评估,与此同时,我们还减少了重新拟合模型的计算代价。
在scikit-learn的实现中,它对我们的k-fold交叉验证做了一个小小的改进,它在每个份的训练集中都有相同的类别比例,请看如下代码:
from sklearn.cross_validation import StratifiedKFold
import numpy as np
scores = []
kfold = StratifiedKFold(y=y_train, n_folds=10, random_state=1)
for train_index, test_index in kfold:
pipe_lr.fit(X_train[train_index], y_train[train_index])
score = pipe_lr.score(X_train[test_index], y_train[test_index])
scores.append(score)
print('类别分布: %s, 准确度: %.3f' % (np.bincount(y_train[train_index]), score))
np.mean(scores)
类别分布: [257 153], 准确度: 0.891
类别分布: [257 153], 准确度: 0.978
类别分布: [257 153], 准确度: 0.978
类别分布: [257 153], 准确度: 0.913
类别分布: [257 153], 准确度: 0.935
类别分布: [257 153], 准确度: 0.978
类别分布: [257 153], 准确度: 0.933
类别分布: [257 153], 准确度: 0.956
类别分布: [257 153], 准确度: 0.978
类别分布: [257 153], 准确度: 0.956
上面,我们自己写for循环去拟合每个训练集。scikit-learn有一种更有效地方式帮我们实现了上述的方法:
from sklearn.cross_validation import cross_val_score
scores = cross_val_score(estimator=pipe_lr, X=X_train, y=y_train, cv=10, n_jobs=1)
print(scores)
上面的n_jobs参数可以指定我们机器上的多个CPU来评估我们每份不同的训练集,这是一个非常有用的参数。
学习曲线和验证曲线
通过绘制模型训练和验证准确性关于训练集大小的函数,我们能很容易地诊断出模型是高方差还是高偏差。
左上角的那个图像是高偏差,这个模型的训练集准确性和交叉验证集准确性都很低,这表明它欠拟合数据。解决高偏差问题通常要增加模型的参数,比如,构建更多的样本特征或减小正则化的程度。
右上角的那个图像是高方差,这个模型的训练集准确性和交叉验证集准确性之间有个很大的缺口,这表明模型很好地拟合了训练集,但是对未见过的数据效果很差。对于过拟合问题,我们可以收集更多地数据或降低模型的复杂度。有一点我们应该注意,如果训练集有很多的噪音或模型已经接近最优性能了,我们收集在多的数据也于事无补。
下面,我们用具体的代码来绘制学习曲线。
from sklearn.learning_curve import learning_curve
pipe_lr = Pipeline([('scl', StandardScaler()), ('clf', LogisticRegression(penalty='l2', random_state=0))])
train_sizes, train_scores, test_scores = learning_curve(estimator=pipe_lr, X=X_train, y=y_train, train_sizes=np.linspace(0.1, 1.0, 10), cv=10, n_jobs=1)
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)
plt.plot(train_sizes, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(train_sizes, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(train_sizes, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(train_sizes, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.grid()
plt.xlabel('Number of training samples')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.ylim([0.8, 1.0])
plt.show()
从上图我们可以看出,模型在交叉训练集上表现地很好。但是,它是有点过拟合的,因为在两个曲线之间有一点明显地间隔。
学习曲线是训练集数量与准确性之间的函数。而验证曲线是不同的模型参数与准确性之间的函数。具体代码如下:
from sklearn.learning_curve import validation_curve
param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]
train_scores, test_scores = validation_curve(estimator=pipe_lr, X=X_train, y=y_train, param_name='clf__C', param_range=param_range, cv=10)
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)
plt.plot(param_range, train_mean, color='blue', marker='o', markersize=5, label='training accuracy')
plt.fill_between(param_range, train_mean + train_std, train_mean - train_std, alpha=0.15, color='blue')
plt.plot(param_range, test_mean, color='green', linestyle='--', marker='s', markersize=5, label='validation accuracy')
plt.fill_between(param_range, test_mean + test_std, test_mean - test_std, alpha=0.15, color='green')
plt.grid()
plt.xscale('log')
plt.legend(loc='lower right')
plt.xlabel('Parameter C')
plt.ylabel('Accuracy')
plt.ylim([0.8, 1.0])
plt.show()
从上图我们可以看到随着参数C的增大,模型有点过拟合数据,因为C越大,就意味着正则化的强度越小。然而,对于小的参数C来说,正则化的强度很大,模型有点欠拟合。我感觉当C在0.1左右是最好的。
在机器学习应用中,我们有两种类型的参数:一个是从训练集中学得的参数,例如逻辑回归的权重;另一个是为了使学习算法达到最优化可调节的参数,例如逻辑回归中的正则化参数或决策树中的深度参数。这种可调节的参数称为超参数(hyperparameters)。
上面我们用验证曲线调节超参数中的一个参数来优化模型。现在,我们要用网格搜索这个更加强大的超参数优化工具来找到超参数值的最优组合从而进一步改善模型的性能。
网格搜索的思路其实很简单,就是列举出所有你想要调节的参数,然后穷举出所有参数组合,最后得出一个使模型性能最好的参数组合。下面,让我们来调节SVM分类器的C,kernel,gamma参数,代码如下:
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVC
pipe_svc = Pipeline([('scl', StandardScaler()), ('clf', SVC(random_state=1))])
param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]
param_grid = [{'clf__C': param_range, 'clf__kernel': ['linear']}, {'clf__C': param_range, 'clf__gamma': param_range, 'clf__kernel': ['rbf']}]
gs = GridSearchCV(estimator=pipe_svc, param_grid=param_grid, scoring='accuracy', cv=10, n_jobs=-1)
gs = gs.fit(X_train, y_train)
print(gs.best_score_)
print(gs.best_params_)
clf = gs.best_estimator_
clf.fit(X_train, y_train)
print('Test accuracy: %.3f' % clf.score(X_test, y_test))
性能指标之 precision, recall, 和F1-score
度量模型的性能指标不仅仅是它的准确性,还有 precision, recall, 和F1-score。下图的四个方块中分别计算了对应情况的数量,我们可以把它看作是一个2 × 2的矩阵。
scikit-learn可以很容易地得出上面的矩阵形式。代码如下:
from sklearn.metrics import confusion_matrix
pipe_svc.fit(X_train, y_train)
y_pred = pipe_svc.predict(X_test)
confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)
print(confmat)
下面用matplotlib的matshow函数更加形象地演示上面的矩阵。
fig, ax = plt.subplots()
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]):
for j in range(confmat.shape[1]):
ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')
plt.xlabel('predicted label')
plt.ylabel('true label')
plt.show()
假设类别1(恶性)为positive类别,那么我们的模型正确地分类属于类别0的71个样本(true negatives) 和属于类别1的40个样本(true positives)。然而,我们的模型也错误地分类原本属于类别1而预测为0的2个样本(false negatives)和原本属于类别0而预测为1的1个样本(false positive)。接下来,我们用这个信息来计算不同的误差评价标准。
在类别很不平衡的机器学习系统中,我们通常用precision(PRE)和recall(REC)来度量模型的性能,下面我给出它们的公式:
PRE=TPTP+FPREC=TPTP+FN
在实际中,我们通常结合两者,组成F1-score:
F1=2PRE×RECPRE+REC
上面3种测量手段,在scikit-learn中都已经实现:
from sklearn.metrics import precision_score, recall_score, f1_score
precision_score(y_true=y_test, y_pred=y_pred)
recall_score(y_true=y_test, y_pred=y_pred)
f1_score(y_true=y_test, y_pred=y_pred)
在介绍ROC曲线前,我先给出true positive rate(TPR)和false positive rate(FPR)的定义:
TPR=TPFN+TPFPR=FPTN+FP
ROC是一种选择分类模型的工具,它是基于true positive rate(TPR)和false positive rate(FPR)的性能来做出选择的。我们通过移动分类器的决策阙值来计算TPR和FPR。ROC图像上的对角线可以看作是随机猜测的结果,如果分类模型在对角线的下面则证明它的性能比随机猜测的结果还要糟糕。基于ROC曲线,我们可以计算出描述分类模型性能的AUC(area under the curve)。在ROC曲线中,左下角的点所对应的是将所有样例判为反例的情况,而右上角的点对应的则是将所有样例判为正例的情况。
下面的代码绘制了ROC曲线。
from sklearn.metrics import roc_curve, auc
from scipy import interp
X_train2 = X_train[:, [4, 14]]
cv = StratifiedKFold(y_train, n_folds=3, random_state=1)
fig = plt.figure()
mean_tpr = 0.0
mean_fpr = np.linspace(0, 1, 100)
all_tpr = []
for i, (train, test) in enumerate(cv):
probas = pipe_lr.fit(X_train2[train], y_train[train]).predict_proba(X_train2[test])
fpr, tpr, thresholds = roc_curve(y_train[test], probas[:, 1], pos_label=1)
mean_tpr += interp(mean_fpr, fpr, tpr)
mean_tpr[0] = 0.0
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, linewidth=1, label='ROC fold %d (area = %0.2f)' % (i+1, roc_auc))
plt.plot([0, 1], [0, 1], linestyle='--', color=(0.6, 0.6, 0.6), label='random guessing')
mean_tpr /= len(cv)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
plt.plot(mean_fpr, mean_tpr, 'k--', label='mean ROC (area = %0.2f)' % mean_auc, lw=2)
plt.plot([0, 0, 1], [0, 1, 1], lw=2, linestyle=':', color='black', label='perfect performance')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.title('Receiver Operator Characteristic')
plt.legend(loc="lower right")
plt.show()
上面代码中涉及到roc_curve类,详情请参考官方文档:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:202055次
积分:3459
积分:3459
排名:第10194名
原创:143篇
转载:14篇
译文:10篇
评论:59条
阅读:52325
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'中国领先的IT技术网站
51CTO旗下网站
七种威胁情报模型调优的方法
众所周知,威胁情报是目前比较新且热的安全防护技术,但其落地和应用对于国内、外企业和组织来说并未全面“开花结果”。安全威胁的本质,就是过于动态而无法一劳永逸。本文中,笔者列举了七种方法可调优威胁情报模型以助您摆脱自满的表象。
作者:陈峻/编译来源:| 10:51
【快译】安全威胁的本质,就是过于动态而无法一劳永逸。那么,这里有一些方法可调优威胁情报模型以助您摆脱自满的表象。
威胁情报的事实真相
请经常询问您的威胁情报服务提供商,有关任何或是所有您所想到的问题。
&他们每个人都应该告诉您,他们是如何收集和校对数据的,& Webroot公司的安全结构高级总监Dave Dufour表示,&他们有历史记录吗?那他们是如何编译的?他们能把威胁从&窗帘&后揪出来吗?这些都是您应该问的。&他补充道。含有恶意IP地址的黑名单被每天更新一次,可能对于大多数组织是足够的。但如果您觉得不够的话,完全可以要求他们做得更为频繁些。
&译者总结:简言之,就是要注意考量威胁情报服务提供商们是如何收集、分析和生成情报的,以及情报的整个生命周期。
当心那些偏差和营销伎俩所粉饰了的数据,咨询公司的IP架构总裁John Pironti警告说:&有时候只会看到一个由于偏差所致的原因或假设。&Pironti补充说,作为供应商和研究人员都会设法寻找对他们某个特定的观点或是&预先定义目的&的支持。所以您从一开始就要准备好询问出各种问题,并完全可以迫使提供商们去证明其数据和结论。
&译者总结:不要被服务提供商所宣称技巧所迷惑,如果不能产生跟您的组织或者威胁模型有关系的威胁情报,那将都是浮云。
购买还是激活
组织和信息安全工作人员有时能会惊讶地发现,他们所面对的是某种根本没有被激活的威胁情报的数据源或服务。所以说他们不是要把钱投入一个新的解决方案,而是要购买已经放在那儿的,而且已经启动了的设备的许可证,才能更具经济效益。Webroot的Dufour如此建议道。
&很多情况下,那些可能需要组织花精力去搭建起来的,却正是他们已经拥有的威胁可见性,&他补充道。用户可能并没有包含其他安全信息的威胁数据源的集合,而可能只能看到那些被阻止或已攻击的部分。CISO(首席信息安全官)并不总是知道每一种之间的转换关系,但信息安全专业人员们却能知道其设备里正在发生着什么。
&译者总结:&售后服务&也很重要。提供商应该为您投入持续的时间,和你一道讨论情报的输入与输出,以产生满足您目前和未来的需求的有价值的数据。
您的威胁防御系统的智能水平取决于它所派生出来的数据。安全专业人员应该持续监测威胁情报数据的静态性,判定它们是否来自白名单或黑名单,以及它们的频率更新,Webroot的Dufour如是说。
在威胁的全局上,客户也应该对于那些正在被用来收集数据的输入感知器的可见性。从而给他们一种方式,来判断供应商或服务提供者,为其特定环境场景所提供的数据的适用性和有效性。威胁情报供应商应该对特定的威胁产生一个声誉评分,其置信区间,是用一个区间的各种数值来提供指定的概率。如果他们不是已经提供了的话,这将是他们用来回应需求的一个不错的增值服务。
Webroot说,另一个值得注意的问题是来自威胁情报数据的假阳性数量。这些阻断和警报不但浪费了时间、减缓了业务、还骚扰了终端用户。
数据,特别是那些威胁情报数据,有时只能成为一种&钝器&而非&利器&。比如说为一个组织而进行的正确数据组合,却可能对另一个组织是极其错误或不适合的。对威胁情报而言,一种固定的模式是不能适合所有的。IP架构师John Pironti如是说。
他鼓励用户留意威胁情报提供商或服务供应商对业务知识的缺失。Pironti警告说:&情报供应商一般不会将客户情报类业务知识纳入到他们的分析和报告之中。&此外,他们所被分配到的风险通常是基于安全专业人员角度的,而不是从更广泛的组织本身的视觉出发的,因此这使得情况更为复杂和微妙。他补充道:一般所要关注的水平应该基于组织,包括其领导层或业务模型。
有时威胁情报服务提供商能提供出很少的或根本没有深入了解到组织的特定风险。&风险评分是基于一般技术条件和规范的,而不是那些受到影响的组织的特有风险。&Pironti解释道。组织需要清楚这些风险评分是如何计算出来的,并在必要时可以要求提供商们予以修改。
&译者总结:有了威胁情报提供商,获取威胁数据源已经不是困难的事情了。反而如何在这些数据产生的同时,能够获取适合组织自身的,而且能加以分析和利用的数据,才是组织和服务提供商需要做足功课的地方。
找自身原因
涉及到如何处理威胁数据时,组织可能会发现他们也有一些来自内部的挑战。根据Ponemon(安全研究中心)和安全报告提供商Anomali的报告显示:在处理威胁响应数据时,超过三分之二的组织(69%)缺乏具有专业知识的技术人员。
阻碍组织如何应对威胁情报数据的另一个问题是缺乏掌控权(58%),而另一些人则认为缺乏合适的技术(52.5%)。&组织在流程方面和报告技能方面的不足,为给威胁数据设定优先级设置了额外的挑战。&Anomali在一份报告的总结部分如是说。
超过一半的受访者(52%)认为他们的组织需要一个合格的分析师,从威胁情报中得到最多价值;几乎相同数量的受访者(49%)表示,他们的信息安全团队根本不接收或阅读任何威胁情报报告。这表明那些工作量本就过载的IT部门,或许已用户被质疑了他们能否真的胜任于管理太多的所谓&首要任务&。
威胁情报数据可以成为一个伟大的工具,一个有助于指导安全专业人员和可能重置日常议程与优先级的晴雨表。但任何流向IT部门的数据量级都是压倒性的(真的有人去审查每条服务器日志吗?)。然而那些威胁情报数据如果不被用来采取任何行动的话,它们将对任何人都没有任何好处。
&您可能没必要去使用那些威胁情报,除非您有能力对它们采取行动。& Anomali的副总裁Jason Trost在最近一次Dark Reading的虚拟事件里提到:&如果您不对它们采取行动的话,您可能都不值得去消费那些数据。&
组织必须探究数据及其内部发生了什么。Webroot的David Dufour表示,然后他们来决定如何(或如需)对数据的显示内容进行应用。&如果您没有可用的资源去使用它们,那么您很可能就是在浪费您的钱财。&他还补充说,不如把这笔钱花费到事件响应的方面。
&译者总结:要注意对情报的整合与应用能力,如果所得的情报不能结合企业实际产生可实施的安全控制和操作的话,更别提和决策流程相结合了。
正确使用威胁情报数据
客户通过自我教育,义不容辞的使得自己在采集和使用安全产品方面变得明智,而不仅仅局限于在威胁情报数据方面。但是作为安全提供商Leidos的Chris Coryea经理也指:值得注意的是信息不对称的发生情况实在是太常见了。
&据IDC的报告,77%的公司调查将SIEM(安全信息与事件管理)与威胁情报相等同,另外35%将威胁情报与安全的社区所提供的共享信息相关联。&Coryea在该公司的博客上写道。&这两点证明了许多组织的网络安全成熟度还在一个浅的层次上。&
&译者总结:除了与SIEM之外,企业还可以将威胁情报数据导入SO(安全运营)并形成联动,从而从风险评估管理的角度制定出适合本企业的解决方案与措施。
供应商可以通过提供相关性、上下文环境和威胁情报内容的态势常识等来帮助企业培养更多威胁的应对能力。信息安全专业人员从而需要按需评估其组织的威胁情报相关性和威胁源的危害价值。
这可能对于信息安全专业人员来说,起初会是个是一个镇痛的意见交换与冲撞的过程。但是如果能正确地和贯彻始终的做到的话,组织不但能更好地保护自己,还能筑起信息安全领域更为广阔的防护&栅栏&。
原文标题:7 Ways To Fine-Tune Your Threat Intelligence Model,作者:Terry Sweeney
【51CTO译稿,合作站点转载请注明原文译者和出处为】
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点热点头条热点热点
24H热文一周话题本月最赞
讲师:41858人学习过
讲师:21581人学习过
讲师:1048人学习过
精选博文论坛热帖下载排行
本书全面介绍了Windows Server 2003 R2中最常用的各种服务,包括域名服务、动态IP地址服务、Windows名称服务、活动目录服务、Web服务、FTP...
订阅51CTO邮刊程序化参数优化与选择
本文主要探讨了在建立程序化交易系统时,如何进行模型参数优化和选择,提出了进行参数优化的必要前提―交易系统的合理性、逻辑性,然后以螺纹钢趋势策略为例,对参数优化结果进行了分析,合理的最优参数应该在附近都有较好的效果,最后分析了过度拟合参数。通过参数优化改进模型,让模型更好地匹配价格波动的模式,提高投资收益;另一方面,我们又要防止对参数的过度优化,导致模型的行情适用性大大降低。
近年来,程序化交易在国内发展迅速,采用程序化作为交易手段的投资者越来越多,国内对程序化交易的研究也越来越深入,开发一个优秀的程序化交易系统,走上稳健获利的投资道路,成为众多交易者追求的目标。在构建程序化交易模型时,不可避免地要进行参数优化,而如何选择合理的模型参数成为投资者重点关注的问题,本文针对模型参数优化进行了分析与讨论。
一、程序化交易系统构成
看似复杂的公式,让读者看起来一头雾水,实际上笔者在开头部分想提出这个公式来说明优秀的程序化交易系统,它的总收益F取决于他的历史平均收益,系统的外在因子对其的影响应该是比较小的,更加通俗的来说,程序化系统模型的好坏,应该是由核心的内在逻辑决定,即模型的本身的思想合理性,系统参数的优化只是可以起到锦上添花的作用,而不是决定性的。借用笔者从网络上看到的一句话可以更加直观的表达,“现代数学对金融市场的数据分析表明,时间价格序列包括两个部分:第一部分是确定项,可以从中找出一定的规律;第二部分是随机项,没有确定性的规律可言,出现某一现象只是概率性的。当我们从市场历史行情中提取交易规则时,需要分析规则的逻辑性和规律性,交易规则需要能够反映市场的规律性,具有一定的合理性。”
通过上面阐述,读者应该明白,无论是趋势模型还是震荡模型,都应该有核心逻辑在其中,而不是简单的代码堆砌。如果模型本身是信手拈来的代码,无根可循,那么无论做何种参数优化,效果如何完善,系统的本身应该是存在问题的。
二、程序化模型参数优化
在拥有一个内在逻辑比较合理的程序化模型之后,我们会希望程序化交易系统能够尽量高的达到历史测试收益,以期达到尽量准确的对未来价格进行预测,不可避免地要涉及对模型参数的正确设置。
通常我们在选取参数时多会碰到两个难点:一是如何选择合适的指标来评价不同参数下模型的表现;二是如何通过参数设置提升模型对未来的适用性。现在借助计算机强大的计算能力,我们可以迅速得出模型在不同参数下历史行情中的表现,通过历史回测效果,可以快速地观察到不同因子对于系统模型的影响,以下笔者通过实例介绍模型参数调优过程中的认识。
在交易开拓者平台,选取螺纹钢指数30min合约上市以来的数据,长度约5年,加载拥有三个参数的趋势策略,收益率曲线如图1所示。
从图2、3、4中可以发现,参数在一定取值范围内均有较好的表现,必然是其吻合了品种价格波动的某些特性,因此笔者可以大胆认为在该取值范围内的参数可以使得模型优异的表现在未来具有可复制性。
上述例子考虑的是单一参数条件下通过使用模型回测来选取合适的参数,而通常一个模型往往会使用多个参数,加大了参数调优的难度,一个较为可行的办法是采用三维视角来评估对比。为了进一步分析多因子对于系统收益的影响,同时优化参数X和Y,三维分析效果如图5所示。
从图5的三维效果图中可以更加直观的观察到,在坐标附近区域,系统的收益率均表现较好,而在较远区域,收益率表现不是很理想。
参数优化在一定程度上可以很好的改善交易系统的历史回测效果,甚至有时候我们发现通过参数优化后得出了一条完美的收益曲线,这时候笔者认为不要高兴太早,做一做笔者上述工作,很有可能你碰到了过度拟合的问题,下面笔者来阐述这个问题。
三、过度拟合
在实际工作过程中,对于程序化稍微了解的朋友,在咨询了解程序化模型时,开始就会问到模型有了几个参数,一般来说,4个以上会被认为已经过度拟合,不可能被接受。笔者认为这种方法太过武断,不可否认参数过多会拟合行情,但是更多的我们应该让数据说话,多做一做观察。图6中阐述参数过度拟合的二维分析效果,分别在数值35和63出现了收益率突增状态。
一般来说,如果附近参数系统的性能远差于最优参数的性能,那这个最优参数有可能是一个过度拟和的结果,在数学上可以认为是奇点解,而不是我们寻找的极大值解。从数学角度来说,奇点是不稳定的,在未来的不确定行情中,一旦市场特征发生变化,最优参数可能变为最差参数。过度拟合是与选取的样本有关系,选取的样本不能代表市场总体走向,只为测试结果为正期望值而调整参数,这叫过度拟合的无效参数。
过度拟合与参数优化的主要矛盾在于,我们优化得到的最优参数只是在我们选取的历史数据样本上成立的,但未来行情却是无法预料的,我们可以找到历史上表现最好的参数,但是这个参数未必在未来是最好的,更有甚者可能历史上最好的参数在未来随着行情波动变化可能就是一组很糟糕的参数。比如一个参数的设置刚好让你抓住了一波大行情,在参数优化取到这样的值时很有可能对未来没有任何帮助。当然有些参数优化仅仅是改善了系统的平均亏损率,对整体效果没有太大影响,这种参数优化可能对未来会有一定意义,但也不是绝对的,因为行情的发展有其不可预知的一方面。
那么还有读者会提到,既然这样,那最好的方法就是交易系统不设置参数,全部固定为经验值,我对这个观点持有不同的看法,我认为市场总是在变化的,而我们使用程序化交易模型就是为了抓住这种变化中的确定性规律,然而这种规律也是时变的,模型参数调整只是为了更好适用行情变化。
现在借助计算机强大的计算能力,我们可以迅速得出模型在不同参数下历史行情中的表现,但是问题在于,我们判定参数的好坏是基于已经发生过的历史行情数据,而未来的行情是动态变化的,与历史行情相比既有相似性,也有变异性。这种变异性,可能使基于历史行情选出的最优的参数在未来行情中并不适用,甚至带来大幅亏损。在构建程序化模型时,一方面,我们可以通过参数优化改进模型,让模型更好地匹配价格波动的模式,提高投资收益;另一方面,我们又要防止对参数的过度优化,导致模型的行情适用性大大降低。因此,模型参数调优是我们构建交易系统过程中的一项技术性与艺术性并重的工作。来源和讯期货
量化易声明:量化易登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成
投资建议。投资者据此操作,风险自担。
仅回复不作评价
交易信号和策略提供者过去的表现对于未来结果不具有指引,我们不能保证任何账户的盈利或亏损。
我们无法保证运行策略会得到预期的结果,由于成功的交易依赖于很多因素,并不只局限于某一种交易方法或某一种交易理论,本网站对于策略是否适合或是否盈利不做任何表述。
用户在进行交易前,请向专业人士咨询并了解交易所存在的风险性。本网站所提供的策略是针对能够充分理解交易的本质及其风险范围的成熟交易者所开发的。用户应对在交易过程中的所有交易行为负责。}

我要回帖

更多关于 模型调优 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信