我想使用来自插入符号模型的折叠预测来训练包含一些原始预测变量的第二阶段模型.我可以收集如下的折叠预测:
#Load Data
set.seed(1)
library(caret)
library(mlbench)
data(BostonHousing)
#Build Model (see ?train)
rpartFit <- train(medv ~ . + rm:lstat, data = BostonHousing, method="rpart",
trControl=trainControl(method='cv', number=folds,
savePredictions=TRUE))
#Collect out-of-fold predictions
out_of_fold <- rpartFit$pred
bestCP <- rpartFit$bestTune[,'.cp']
out_of_fold <- out_of_fold[out_of_fold$.cp==bestCP,]
Run Code Online (Sandbox Code Playgroud)
这很好,但它们的顺序错误:
> all.equal(out_of_fold$obs, BostonHousing$medv)
[1] "Mean relative difference: 0.4521906"
Run Code Online (Sandbox Code Playgroud)
我知道该train对象返回一个列表,其中列出了用于训练每个折叠的索引:
> str(rpartFit$control$index)
List of 10
$ Fold01: int [1:457] 1 2 3 4 5 6 7 8 9 10 ...
$ Fold02: int [1:454] 2 3 4 8 10 11 12 …Run Code Online (Sandbox Code Playgroud) 通常,我想对包含一些因子变量的数据集运行交叉验证,并且在运行一段时间后,交叉验证例程失败并出现错误:factor x has new levels Y.
例如,使用包启动:
library(boot)
d <- data.frame(x=c('A', 'A', 'B', 'B', 'C', 'C'), y=c(1, 2, 3, 4, 5, 6))
m <- glm(y ~ x, data=d)
m.cv <- cv.glm(d, m, K=2) # Sometimes succeeds
m.cv <- cv.glm(d, m, K=2)
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
# factor x has new levels B
Run Code Online (Sandbox Code Playgroud)
更新:这是一个玩具示例.同样的问题也出现在较大的数据集中,其中有几次出现级别,C但它们都不存在于训练分区中.
createDataPartition包caret中的函数函数对结果变量进行分层抽样并正确警告:
此外,对于'createDataPartition',非常小的类大小(<= 3),类可能不会出现在训练和测试数据中.
我想到两种解决方案: …
我正在尝试使用可用的数据为几种分类方法/ hiper参数制作k倍CV
该集由208行组成,每行有60个属性.我正在使用read.table函数将其读入data.frame.
下一步是将我的数据分成k个折叠,假设k = 5.我的第一次尝试是使用
test < - createFolds(t,k = 5)
我有两个问题.第一个是折叠的长度彼此不相邻:
Run Code Online (Sandbox Code Playgroud)Length Class ModeFold1 29 -none-数字
折叠2 14-无 - 数字
折叠3 7-无 - 数字
折叠4 5 - 无 - 数字
折叠5 5 - 无 - 数字
另一个是,这显然是根据属性索引分割我的数据,但我想分割数据本身.我认为通过转置我的data.frame,使用:
test < - t(myDataNumericValues)
但是当我调用createFolds函数时,它给了我这样的东西:
Run Code Online (Sandbox Code Playgroud)Length Class ModeFold1 2496 -none-数字
折叠2 2496 -none-数字
折叠3 2495
-none- 数字折叠4 2496
-none- 数字折叠5 2497 -none-数字
长度问题已经解决,但它仍然没有相应地分割我的208数据.
关于我能做什么的任何想法?你认为插入包不是最合适的吗?
提前致谢
我有一个20列的矩阵.最后一列是0/1标签.
这里有数据链接.
我正在尝试使用交叉验证在数据集上运行随机林.我使用两种方法:
sklearn.cross_validation.cross_val_scoresklearn.cross_validation.train_test_split当我做我认为完全相同的事情时,我会得到不同的结果.举例来说,我使用上面的两种方法运行双重交叉验证,如下面的代码所示.
import csv
import numpy as np
import pandas as pd
from sklearn import ensemble
from sklearn.metrics import roc_auc_score
from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import cross_val_score
#read in the data
data = pd.read_csv('data_so.csv', header=None)
X = data.iloc[:,0:18]
y = data.iloc[:,19]
depth = 5
maxFeat = 3
result = cross_val_score(ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False), X, y, scoring='roc_auc', cv=2)
result
# result is now something like array([ 0.66773295, 0.58824739])
xtrain, xtest, ytrain, ytest = …Run Code Online (Sandbox Code Playgroud) 我正在努力解决机器学习问题.我有一个具有时间序列元素的特定数据集.对于这个问题,我正在使用着名的python库 - sklearn.这个库中有很多交叉验证迭代器.还有几个迭代器可以自己定义交叉验证.问题是我真的不知道如何为时间序列定义简单的交叉验证.这是我想要得到的一个很好的例子:
假设我们有几个句点(年),我们想将我们的数据集分成几个块,如下所示:
data = [1, 2, 3, 4, 5, 6, 7]
train: [1] test: [2] (or test: [2, 3, 4, 5, 6, 7])
train: [1, 2] test: [3] (or test: [3, 4, 5, 6, 7])
train: [1, 2, 3] test: [4] (or test: [4, 5, 6, 7])
...
train: [1, 2, 3, 4, 5, 6] test: [7]
Run Code Online (Sandbox Code Playgroud)
我无法真正理解如何使用sklearn工具创建这种交叉验证.也许我应该用PredefinedSplit从sklearn.cross_validation这样的:
train_fraction = 0.8
train_size = int(train_fraction * X_train.shape[0])
validation_size = X_train.shape[0] - train_size …Run Code Online (Sandbox Code Playgroud) 有什么区别:StratifiedKFold,StratifiedShuffleSplit,StratifiedKFold + Shuffle?我什么时候应该使用每一个?当我获得更好的准确度分数?为什么我没有得到类似的结果?我已经把我的代码和结果.我正在使用朴素贝叶斯和10x10交叉验证.
#######SKF FOR LOOP########
from sklearn.cross_validation import StratifiedKFold
for i in range(10):
skf = StratifiedKFold(y, n_folds=10, shuffle=True)
scoresSKF2 = cross_validation.cross_val_score(clf, x, y , cv=skf)
print(scoresSKF2)
print("Accuracy SKF_NB: %0.2f (*/- %0.2f)" % (scoresSKF2.mean(), scoresSKF2.std()* 2))
print("")
[ 0.1750503 0.16834532 0.16417051 0.18205424 0.1625758 0.1750939
0.15495808 0.1712963 0.17096494 0.16918166]
Accuracy SKF_NB: 0.17 (*/- 0.01)
[ 0.16297787 0.17956835 0.17309908 0.17686093 0.17239388 0.16093615
0.16970223 0.16956019 0.15473776 0.17208358]
Accuracy SKF_NB: 0.17 (*/- 0.01)
[ 0.17102616 0.16719424 0.1733871 0.16560877 0.166041 0.16122508
0.16767852 0.17042824 0.18719212 0.1677307 …Run Code Online (Sandbox Code Playgroud) 我正在使用keras训练RNN,并希望了解验证准确度如何随数据集大小而变化.Keras val_acc在其历史对象中有一个名单,该列表在每个时期之后附加,具有相应的验证集准确性(链接到google组中的帖子).我想获得val_acc运行时期数的平均值,并根据相应的数据集大小进行绘制.
问题:如何检索val_acc列表中的元素并执行类似的操作numpy.mean(val_acc)?
编辑:正如@runDOSrun所说,得到val_accs 的意思是没有意义的.让我专注于进入决赛val_acc.
我尝试了@nemo的建议,但没有运气.这是我打印时得到的
model.fit(X_train, y_train, batch_size = 512, nb_epoch = 5, validation_split = 0.05).__dict__
输出:
{'model': <keras.models.Sequential object at 0x000000001F752A90>, 'params': {'verbose': 1, 'nb_epoch': 5, 'batch_size': 512, 'metrics': ['loss', 'val_loss'], 'nb_sample': 1710, 'do_validation': True}, 'epoch': [0, 1, 2, 3, 4], 'history': {'loss': [0.96936064512408959, 0.66933631673890948, 0.63404161288724303, 0.62268789783555867, 0.60833334699708819], 'val_loss': [0.84040999412536621, 0.75676006078720093, 0.73714292049407959, 0.71032363176345825, 0.71341043710708618]}}
Run Code Online (Sandbox Code Playgroud)
事实证明val_acc,我的历史词典中没有列表.
问题:如何val_acc在history字典中加入?
machine-learning neural-network cross-validation keras recurrent-neural-network
我正在Keras中实现一个多层感知器并使用scikit-learn来执行交叉验证.为此,我受到了Keras交叉验证问题中的代码的启发
from sklearn.cross_validation import StratifiedKFold
def load_data():
# load your data using this function
def create model():
# create your model using this function
def train_and_evaluate__model(model, data[train], labels[train], data[test], labels[test)):
# fit and evaluate here.
if __name__ == "__main__":
X, Y = load_model()
kFold = StratifiedKFold(n_splits=10)
for train, test in kFold.split(X, Y):
model = None
model = create_model()
train_evaluate(model, X[train], Y[train], X[test], Y[test])
Run Code Online (Sandbox Code Playgroud)
在我对神经网络的研究中,我了解到神经网络的知识表示是在突触权重和网络跟踪过程中,更新的权重,从而降低网络错误率并改善其性能.(就我而言,我正在使用监督学习)
为了更好地训练和评估神经网络性能,一种常用的方法是交叉验证,它返回数据集的分区,用于训练和评估模型.
我怀疑是......
在此代码段中:
for train, test in kFold.split(X, Y):
model = None
model = …Run Code Online (Sandbox Code Playgroud) machine-learning neural-network scikit-learn cross-validation keras
我试图弄清楚如何在 python 中使用 lightgbm 训练 gbdt 分类器,但对官方网站上提供的示例感到困惑。按照列出的步骤,我发现validation_data来自任何地方,并且没有关于valid_data的格式的线索,也没有关于有或没有它的训练模型的优点或效用的线索。
另一个问题是,在文档中,据说“验证数据应该与训练数据对齐”,当我查看数据集详细信息时,我发现还有另一个声明表明“如果这是数据集为了进行验证,应使用训练数据作为参考”。我的最后一个问题是,为什么验证数据应该与训练数据保持一致?数据集中参考的含义是什么以及在训练过程中如何使用它?是否通过训练数据的参考集来实现对齐目标?这种“参考”策略和交叉验证有什么区别?希望有人能帮我走出这个迷宫,谢谢!
我刚刚阅读了k-fold交叉验证,并意识到我无意中使用当前的预处理设置泄漏数据.
通常,我有一个火车和测试数据集.我在整个火车数据集上做了一堆数据插补和一次热编码,然后运行k-fold交叉验证.
泄漏是因为,如果我正在进行5倍交叉验证,我将训练80%的列车数据,并在剩余的20%的列车数据上进行测试.
我真的应该根据80%的火车来估算20%(而我之前使用的是100%的数据).
1)这是考虑交叉验证的正确方法吗?
2)我一直在研究这个Pipeline类sklearn.pipeline,它似乎对做一堆变换很有用,然后最终将模型拟合到结果数据中.但是,我正在做一些像" float64用平均值列出缺失数据"这样的东西,"用模式归还所有其他数据",等等.
这种插补没有明显的变压器.我该如何将这一步添加到Pipeline?我会创建自己的子类BaseEstimator吗?
这里的任何指导都会很棒!
cross-validation ×10
scikit-learn ×5
r ×3
keras ×2
python ×2
r-caret ×2
lightgbm ×1
pipeline ×1
python-3.x ×1