标签: cross-validation

如何从R中的线性模型中获得交叉验证的r-square?

我在R中有一个线性模型

set.seed(1234)
x <- rnorm(100)
z <- rnorm(100)
y <- rnorm(100, x+z)
mydata <- data.frame(x,y,z)

fit <- lm(y ~ x + z, mydata)
Run Code Online (Sandbox Code Playgroud)

我想获得样本r-square的估计值.我正在考虑使用某种形式的k-fold交叉验证.

  • R中的代码采用线性模型拟合并返回交叉验证的r平方?
  • 或者是否有其他方法可以使用R获得交叉验证的r-square?

r linear-regression cross-validation

7
推荐指数
1
解决办法
5991
查看次数

sklearn - 对类的子集进行精确评分的交叉验证

我有一个分类数据集,有3个类标签[0,1,2].

我想运行交叉验证并尝试几个估算器,但我对只有1级和2级精度的评分感兴趣.我不关心0级的精度,我不希望它的得分甩开CV优化.我也不关心任何课程的召回.换句话说,我想确保无论何时预测1或2,它都具有很高的置信度.

所以问题是,如何运行cross_val_score并告诉其评分函数忽略0级的精度?

更新:根据接受的答案,这是一个示例答案代码:

def custom_precision_score(y_true,y_pred):
  precision_tuple, recall_tuple, fscore_tuple, support_tuple = metrics.precision_recall_fscore_support(y_true, y_pred)
  precision_tuple = precision_tuple[1:]
  support_tuple = support_tuple[1:]
  weighted_precision = np.average(precision_tuple, weights=support_tuple)
  return weighted_precision

custom_scorer = metrics.make_scorer(custom_precision_score)

scores = cross_validation.cross_val_score(clf, featuresArray, targetArray, cv=10, scoring=custom_scorer)
Run Code Online (Sandbox Code Playgroud)

python machine-learning scikit-learn cross-validation

7
推荐指数
1
解决办法
1958
查看次数

rpart中CP表给出的树大小

在R包rpart中,是什么决定了CP表中为决策树提供的树的大小?在下面的示例中,CP表默认仅显示具有1,2和5个节点的树(分别为nsplit = 0,1和4).

library(rpart)   
fit <- rpart(Kyphosis ~ Age + Number + Start, method="class", data=kyphosis)
> printcp(fit) 

Classification tree:
rpart(formula = Kyphosis ~ Age + Number + Start, data = kyphosis, 
method = "class")

Variables actually used in tree construction:
[1] Age   Start

Root node error: 17/81 = 0.20988

n= 81 

        CP nsplit rel error  xerror    xstd
1 0.176471      0   1.00000 1.00000 0.21559
2 0.019608      1   0.82353 0.94118 0.21078
3 0.010000      4   0.76471 0.94118 0.21078
Run Code Online (Sandbox Code Playgroud)

是否有一个固有的规则rpart()来确定要呈现的树木大小?并且是否可以强制printcp()返回所有可能大小的树的交叉验证统计信息,即对于上面的示例,还包括具有3和4个节点的树的行(nsplit …

tree r decision-tree cross-validation rpart

7
推荐指数
1
解决办法
1万
查看次数

深度神经网络中的交叉验证

如何在深度神经网络中进行交叉验证?我知道执行交叉验证将在所有折叠上训练它,除了一个折叠并在排除的折叠上测试它。然后对 k 次折叠执行此操作,并平均每次折叠的准确率。您如何为每次迭代执行此操作。您是否在每次折叠时更新参数?或者您对每次迭代执行 k 折交叉验证?或者对所有折叠的每次训练都被视为一次迭代?

cross-validation deep-learning tensorflow

7
推荐指数
1
解决办法
1万
查看次数

解读 sklearns 的 GridSearchCV 最佳成绩

我想知道返回的分数与如下计算GridSearchCVR2度量之间的差异。在其他情况下,我收到的网格搜索分数非常负面(同样适用于cross_val_score),我将不胜感激解释它是什么。

from sklearn import datasets
from sklearn.model_selection import (cross_val_score, GridSearchCV)
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import accuracy_score, r2_score
from sklearn import tree

diabetes = datasets.load_diabetes()
X = diabetes.data[:150]
y = diabetes.target[:150]
X = pd.DataFrame(X)

parameters = {'splitter':('best','random'), 
              'max_depth':np.arange(1,10), 
              'min_samples_split':np.arange(2,10), 
              'min_samples_leaf':np.arange(1,5)}

regressor = GridSearchCV(DecisionTreeRegressor(), parameters, scoring = 'r2', cv = 5)
regressor.fit(X, y)

print('Best score: ', regressor.best_score_)
best = regressor.best_estimator_
print('R2: ', r2_score(y_pred = best.predict(X), y_true = y))
Run Code Online (Sandbox Code Playgroud)

python scikit-learn cross-validation grid-search

7
推荐指数
2
解决办法
1万
查看次数

GridSearchCV.best_score 与 cross_val_score(GridSearchCV.best_estimator_) 不同

考虑以下 gridsearch :
grid = GridSearchCV(clf, parameters, n_jobs =-1, iid=True, cv =5)
grid_fit = grid.fit(X_train1, y_train1)

根据 Sklearn 的资源,grid_fit.best_score_ 返回best_estimator 的平均交叉验证分数

对我来说,这意味着:

cross_val_score(grid_fit.best_estimator_, X_train1, y_train1, cv=5)

应该完全相同:

grid_fit.best_score_.

但是我得到了两个数字之间 10% 的差异。我错过了什么?

我在专有数据上使用 gridsearch,所以我希望有人在过去遇到过类似的事情,并且可以在没有完全可重现的示例的情况下指导我。如果不够清楚,我将尝试使用 Iris 数据集重现它...

python scikit-learn cross-validation grid-search

7
推荐指数
1
解决办法
1287
查看次数

分组时间序列(面板)数据的交叉验证

我使用面板数据:随着时间的推移,我观察了许多单位(例如人);对于每个单元,我都有相同固定时间间隔的记录。

当将数据分成训练集和测试集时,我们需要确保两个集是不相交的和顺序的,即训练集中的最新记录应该在测试集中最早的记录之前(参见例如这篇博客文章)。

面板数据是否有任何标准的 Python 交叉验证实现?

我试过 Scikit-Learn 的TimeSeriesSplit,它不能考虑组,GroupShuffleSplit不能考虑数据的顺序性质,见下面的代码。

import pandas as pd
import numpy as np
from sklearn.model_selection import GroupShuffleSplit, TimeSeriesSplit

# generate panel data
user = np.repeat(np.arange(10), 12)
time = np.tile(pd.date_range(start='2018-01-01', periods=12, freq='M'), 10)
data = (pd.DataFrame({'user': user, 'time': time})
        .sort_values(['time', 'user'])
        .reset_index(drop=True))

tscv = TimeSeriesSplit(n_splits=4)
for train_idx, test_idx in tscv.split(data):
    train = data.iloc[train_idx]
    test = data.iloc[test_idx]
    train_end = train.time.max().date()
    test_start = test.time.min().date()
    print('TRAIN:', train_end, '\tTEST:', test_start, '\tSequential:', train_end < test_start, …
Run Code Online (Sandbox Code Playgroud)

time-series python-3.x scikit-learn cross-validation panel-data

7
推荐指数
2
解决办法
2473
查看次数

从 cva.glmnet 对象中提取最佳参数

我确信在运行 cva.glmnet 后有一种优雅的方法可以提取最佳的 alpha 和 lambda,但不知何故我找不到它。

这是我在此期间使用的代码。

谢谢

library(data.table);library(glmnetUtils);library(useful)

# make some dummy data

data(iris)

x <- useful::build.x(data = iris,formula = Sepal.Length ~ .)
y <- iris$Sepal.Length

# run cv for alpha in c(0,0.5,1)

output.of.cva.glmnet <- cva.glmnet(x=x,y=y,alpha = c(0,0.5,1))

# extract the best parameters

number.of.alphas.tested <- length(output.of.cva.glmnet$alpha)

cv.glmnet.dt <- data.table()

for (i in 1:number.of.alphas.tested){
  glmnet.model <- output.of.cva.glmnet$modlist[[i]]
  min.mse <-  min(glmnet.model$cvm)
  min.lambda <- glmnet.model$lambda.min
  alpha.value <- output.of.cva.glmnet$alpha[i]
  new.cv.glmnet.dt <- data.table(alpha=alpha.value,min_mse=min.mse,min_lambda=min.lambda)
  cv.glmnet.dt <- rbind(cv.glmnet.dt,new.cv.glmnet.dt)
}

best.params <- cv.glmnet.dt[which.min(cv.glmnet.dt$min_mse)]
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

r glmnet cross-validation

7
推荐指数
1
解决办法
1133
查看次数

如何计算sklearn中每个交叉验证模型中的特征重要性

我使用RandomForestClassifier()10 fold cross validation如下。

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
accuracy = cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy')
print(accuracy.mean())
Run Code Online (Sandbox Code Playgroud)

我想确定特征空间中的重要特征。获得单个分类的特征重要性似乎很简单,如下所示。

print("Features sorted by their score:")
feature_importances = pd.DataFrame(clf.feature_importances_,
                                   index = X_train.columns,
                                    columns=['importance']).sort_values('importance', ascending=False)
print(feature_importances)
Run Code Online (Sandbox Code Playgroud)

但是,我怎么也找不到执行feature importancecross validation在sklearn。

总之,我想average importance score在 10 次交叉验证中确定最有效的特征(例如,通过使用)。

如果需要,我很乐意提供更多详细信息。

python classification machine-learning scikit-learn cross-validation

7
推荐指数
1
解决办法
5359
查看次数

使用 pytorch 和 sklearn 对 MNIST 数据集进行交叉验证

我是 pytorch 的新手,正在尝试实现一个前馈神经网络来对 mnist 数据集进行分类。我在尝试使用交叉验证时遇到了一些问题。我的数据具有以下形状 x_train:: torch.Size([45000, 784])y_traintorch.Size([45000])

我尝试使用 sklearn 中的 KFold。

kfold =KFold(n_splits=10)

这是我的训练方法的第一部分,我将数据分成几部分:

for  train_index, test_index in kfold.split(x_train, y_train): 
        x_train_fold = x_train[train_index]
        x_test_fold = x_test[test_index]
        y_train_fold = y_train[train_index]
        y_test_fold = y_test[test_index]
        print(x_train_fold.shape)
        for epoch in range(epochs):
         ...
Run Code Online (Sandbox Code Playgroud)

y_train_fold变量的索引是正确的,它只是: [ 0 1 2 ... 4497 4498 4499],但它不是 for x_train_fold,而是[ 4500 4501 4502 ... 44997 44998 44999]。测试折叠也是如此。

对于第一次迭代,我希望变量x_train_fold是前 4500 张图片,换句话说,具有 shape torch.Size([4500, 784]),但它具有 shapetorch.Size([40500, 784])

关于如何做到这一点的任何提示?

scikit-learn cross-validation mnist pytorch k-fold

7
推荐指数
2
解决办法
1万
查看次数