我在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交叉验证.
我有一个分类数据集,有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) 在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 …
如何在深度神经网络中进行交叉验证?我知道执行交叉验证将在所有折叠上训练它,除了一个折叠并在排除的折叠上测试它。然后对 k 次折叠执行此操作,并平均每次折叠的准确率。您如何为每次迭代执行此操作。您是否在每次折叠时更新参数?或者您对每次迭代执行 k 折交叉验证?或者对所有折叠的每次训练都被视为一次迭代?
我想知道返回的分数与如下计算GridSearchCV的R2度量之间的差异。在其他情况下,我收到的网格搜索分数非常负面(同样适用于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) 考虑以下 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 的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
我确信在运行 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)
我使用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 importance对cross validation在sklearn。
总之,我想average importance score在 10 次交叉验证中确定最有效的特征(例如,通过使用)。
如果需要,我很乐意提供更多详细信息。
python classification machine-learning scikit-learn cross-validation
我是 pytorch 的新手,正在尝试实现一个前馈神经网络来对 mnist 数据集进行分类。我在尝试使用交叉验证时遇到了一些问题。我的数据具有以下形状
x_train::
torch.Size([45000, 784])和
y_train:torch.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])
关于如何做到这一点的任何提示?
cross-validation ×10
scikit-learn ×6
python ×4
r ×3
grid-search ×2
glmnet ×1
k-fold ×1
mnist ×1
panel-data ×1
python-3.x ×1
pytorch ×1
rpart ×1
tensorflow ×1
time-series ×1
tree ×1