标签: cross-validation

numpy:如何在np数组中选择特定索引进行k-fold交叉验证?

我有一个尺寸为5000 x 3027(CIFAR-10数据集)的矩阵形式的训练数据集.在numpy中使用array_split,我将它分成5个不同的部分,我想只选择其中一个部分作为交叉验证折叠.然而,当我使用像XTrain [[Indexes]]之类的东西时,我的问题出现了,其中索引是像[0,1,2,3]这样的数组,因为这样做会给我一个尺寸为4 x 1000 x 3027的3D张量,而不是矩阵.如何将"4 x 1000"折叠成4000行,以获得4000 x 3027的矩阵?

for fold in range(len(X_train_folds)):
    indexes = np.delete(np.arange(len(X_train_folds)), fold) 
    XTrain = X_train_folds[indexes]
    X_cv = X_train_folds[fold]
    yTrain = y_train_folds[indexes]
    y_cv = y_train_folds[fold]

    classifier.train(XTrain, yTrain)
    dists = classifier.compute_distances_no_loops(X_cv)
    y_test_pred = classifier.predict_labels(dists, k)

    num_correct = np.sum(y_test_pred == y_test)
    accuracy = float(num_correct/num_test)
    k_to_accuracy[k] = accuracy
Run Code Online (Sandbox Code Playgroud)

python arrays numpy machine-learning cross-validation

6
推荐指数
2
解决办法
1739
查看次数

使用 StratifiedKFold 创建训练/测试/验证分割

我正在尝试StratifiedKFold创建训练/测试/验证分割,以便在非 sklearn 机器学习工作流程中使用。因此,DataFrame 需要被拆分并保持这种状态。

我尝试按照以下方式执行此操作,.values因为我正在传递 pandas DataFrames:

skf = StratifiedKFold(n_splits=3, shuffle=False)
skf.get_n_splits(X, y)

for train_index, test_index, valid_index in skf.split(X.values, y.values):
    print("TRAIN:", train_index, "TEST:", test_index,  "VALID:", valid_index)
    X_train, X_test, X_valid = X.values[train_index], X.values[test_index], X.values[valid_index]
    y_train, y_test, y_valid = y.values[train_index], y.values[test_index], y.values[valid_index]
Run Code Online (Sandbox Code Playgroud)

这失败了:

skf = StratifiedKFold(n_splits=3, shuffle=False)
skf.get_n_splits(X, y)

for train_index, test_index, valid_index in skf.split(X.values, y.values):
    print("TRAIN:", train_index, "TEST:", test_index,  "VALID:", valid_index)
    X_train, X_test, X_valid = X.values[train_index], X.values[test_index], X.values[valid_index]
    y_train, y_test, y_valid = y.values[train_index], y.values[test_index], y.values[valid_index]
Run Code Online (Sandbox Code Playgroud)

我通读了所有sklearn …

python pandas scikit-learn cross-validation data-science

6
推荐指数
1
解决办法
6614
查看次数

xgboost 的 cross_val_score 与“early_stopping_rounds”返回“IndexError”

我正在使用 sklearn 和 xgboost 在 python (v3.6) 中研究回归模型。我想用 Early_stopping_rounds 计算 sklearn.cross_val_score 。以下代码返回错误:

xgb_model = xgb.XGBRegressor(n_estimators=600,
                             learning_rate=0.06)

xgb_cv = cross_val_score(xgb_model, train_x, train_y, 
                         cv=5, scoring='neg_mean_absolute_error',
                         fit_params={'early_stopping_rounds':3})

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

另外,如果我尝试将参数作为“xgbregressor__early_stopping_rounds”传递(如在一些相关主题中在线找到的),则会显示以下错误:

TypeError: fit() got an unexpected keyword argument
'xgbregressor__early_stopping_rounds'
Run Code Online (Sandbox Code Playgroud)

如果我在没有“fit_params”的情况下运行相同的模型,则一切正常。使用 cross_val_score 时有什么方法可以避免此错误吗?

python scikit-learn cross-validation xgboost

6
推荐指数
1
解决办法
6242
查看次数

GridSearchCV 如何计算训练分数?

我很难弄清楚return_train_score中的参数GridSearchCV。来自文档

\n
\n

return_train_score:布尔值,可选

\n

\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0如果False,该cv_results_属性将不包含训练分数。

\n
\n

我的问题是:训练成绩是多少?

\n

在下面的代码中,我将数据分成十个分层折叠。结果grid.cv_results_包含十个测试分数,即\'split0_test_score\', \'split1_test_score\', ..., \'split9_test_score\'。我知道其中每一个都是 5 个最近邻分类器获得的成功率,该分类器使用相应的折叠进行测试并使用剩余的九个折叠进行训练。

\n

grid.cv_results_还包含十个火车分数:\'split0_train_score\', \'split1_train_score\', ..., \'split9_train_score\'。这些值是如何计算的?

\n
from sklearn import datasets\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.model_selection import StratifiedKFold    \n\nX, y = datasets.load_iris(True)\n\nskf = StratifiedKFold(n_splits=10, random_state=0)\nknn = KNeighborsClassifier()\n\ngrid = GridSearchCV(estimator=knn, \n                    cv=skf, \n                    param_grid={\'n_neighbors\': [5]}, \n                    return_train_score=True)\ngrid.fit(X, y)\n\nprint(\'Mean test score: {}\'.format(grid.cv_results_[\'mean_test_score\']))\nprint(\'Mean …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn cross-validation grid-search

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

无法在多标签分类器上使用 Stratified-K-Fold

以下代码用于进行 KFold 验证,但我要训练模型,因为它抛出错误

ValueError: Error when checking target: expected dense_14 to have shape (7,) but got array with shape (1,)
Run Code Online (Sandbox Code Playgroud)

我的目标变量有 7 个类。我正在使用LabelEncoder将类编码为数字。

通过看到此错误,如果我将其更改为MultiLabelBinarizer对类进行编码。我收到以下错误

ValueError: Supported target types are: ('binary', 'multiclass'). Got 'multilabel-indicator' instead.
Run Code Online (Sandbox Code Playgroud)

以下是KFold验证的代码

skf = StratifiedKFold(n_splits=10, shuffle=True)
scores = np.zeros(10)
idx = 0
for index, (train_indices, val_indices) in enumerate(skf.split(X, y)):
    print("Training on fold " + str(index+1) + "/10...")
    # Generate batches from indices
    xtrain, xval = X[train_indices], X[val_indices]
    ytrain, yval = y[train_indices], y[val_indices]
    model …
Run Code Online (Sandbox Code Playgroud)

scikit-learn cross-validation deep-learning keras

6
推荐指数
1
解决办法
6061
查看次数

具有 n 倍交叉验证的精确召回曲线显示标准偏差

我想生成一条具有 5 倍交叉验证的精确召回曲线,显示标准偏差,如示例ROC 曲线代码所示

下面的代码(改编自如何在 Scikit-Learn 中绘制超过 10 倍交叉验证的 PR曲线)给出了每次交叉验证的 PR 曲线以及平均 PR 曲线。我还想以灰色显示平均 PR 曲线上方和下方一个标准差的区域。但它给出了以下错误(详细信息在代码下面的链接中):

ValueError: operands could not be broadcast together with shapes (91,) (78,)

import matplotlib.pyplot as plt
import numpy
from sklearn.datasets import make_blobs
from sklearn.metrics import precision_recall_curve, auc
from sklearn.model_selection import KFold
from sklearn.svm import SVC


X, y = make_blobs(n_samples=500, n_features=2, centers=2, cluster_std=10.0,
    random_state=10)

k_fold = KFold(n_splits=5, shuffle=True, random_state=10)
predictor = SVC(kernel='linear', C=1.0, probability=True, random_state=10)

y_real = []
y_proba = []

precisions, …
Run Code Online (Sandbox Code Playgroud)

python machine-learning scikit-learn cross-validation precision-recall

6
推荐指数
1
解决办法
2254
查看次数

“PolynomialFeatures”对象没有属性“predict”

我想对以下回归模型应用 k 折交叉验证:

  1. 线性回归
  2. 多项式回归
  3. 支持向量回归
  4. 决策树回归
  5. 随机森林回归

我可以对除多项式回归之外的所有内容应用 k 折交叉验证,这会给我带来这个错误PolynomialFeatures' object has no attribute 'predict。如何解决这个问题。我是否正确地完成了这项工作,实际上我的主要动机是看看哪个模型表现更好,那么有没有更好的方法来完成这项工作?

# Compare Algorithms
import pandas
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.linear_model import LinearRegression

from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor

# load dataset
names = ['YearsExperience', 'Salary']
dataframe = pandas.read_csv('Salary_Data.csv', names=names)
array = dataframe.values
X = array[1:,0]
Y = array[1:,1]

X = X.reshape(-1, 1)
Y = Y.reshape(-1, 1)

# …
Run Code Online (Sandbox Code Playgroud)

python regression python-3.x scikit-learn cross-validation

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

如何解释 cv.kknn(kknn 包)的交叉验证输出

我试图解释在尝试交叉验证 k 最近邻模型的数据时得到的结果。我的数据集设置如下

变量 1(int) | 变量2(整数)| 变量 3(int) | 变量4(整数)| 响应(因子)

选择模型后,我将 80% 的数据分成 cvdata,20% 用于测试。

我的代码的一次迭代如下:

    cv <- cv.kknn(formula = Response~., cvdata, kcv = 10, k = 7, kernel = 'optimal', scale = TRUE)
    cv
Run Code Online (Sandbox Code Playgroud)

当我运行“cv”时,它只返回一个 list(),其中包含一些看似随机的数字作为行名、观察到的结果变量 (y) 和预测结果变量 (yhat)。我正在尝试计算测试集的某种准确性。我应该将 y 与 yhat 进行比较来验证吗?

编辑:输出添加到下面

    [[1]]
         y        yhat
    492 1 0.724282776
    654 0 0.250394372
    427 0 0.125159894
    283 0 0.098561768
    218 1 0.409990851

    [[2]]
     [1] 0.2267058 0.1060212
Run Code Online (Sandbox Code Playgroud)

r knn cross-validation

6
推荐指数
1
解决办法
8430
查看次数

获取类型错误:单例数组 array(None, dtype=object) 不能被视为有效集合

我正在使用不同的交叉验证方法。我首先在我的代码上使用 k Fold 方法,效果非常好,但是当我使用repeatedstratifiedkfold方法时,它给了我这个错误

TypeError: Singleton array array(None, dtype=object) cannot be considered a valid collection.
Run Code Online (Sandbox Code Playgroud)

任何人都可以在这方面帮助我吗?以下是产生该问题的最少代码。

import numpy as np
from sklearn.model_selection import RepeatedStratifiedKFold


ss = RepeatedStratifiedKFold(n_splits=5, n_repeats=2, random_state=0)

X = np.random.rand(100, 5)
y = np.random.rand(100, 1)

for train_index, test_index in ss.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
Run Code Online (Sandbox Code Playgroud)

这是完整的引用 -

start
Traceback (most recent call last):

  File "C:\Users\full details of final year project\AZU\test_tace_updated.py", line 81, in <module>
    main()

  File "C:\Users\AZU\test_tace_updated.py", line 54, in main …
Run Code Online (Sandbox Code Playgroud)

python machine-learning cross-validation k-fold

6
推荐指数
1
解决办法
3323
查看次数

具有权重和 base_margin 的 XGBRegressor:可以进行样本外验证吗?

我有一个旧的线性模型,我希望使用 XGBoost 对其进行改进。我有旧模型的预测,我希望将其用作基本边距。另外,由于我建模的性质,我需要使用权重。我的旧 glm 是一个泊松回归,其公式number_of_defaults/exposure ~ param_1 + param_2和权重设置为exposure(与响应变量中的分母相同)。在数据上训练新的 XGBoost 模型时,我这样做:

xgb_model = xgb.XGBRegressor(n_estimators=25,
                             max_depth=100,
                             max_leaves=100,
                             learning_rate=0.01,
                             n_jobs=4,
                             eval_metric="poisson-nloglik",
                             nrounds=50)

model = xgb_model.fit(X=X_train, y=y_train, sample_weight=_WEIGHT, base_margin=_BASE_MARGIN)
Run Code Online (Sandbox Code Playgroud)

,其中_WEIGHT_BASE_MARGIN是权重和预测(从 X_train 中弹出)。但是,当我需要指定权重和基本边距时,如何进行交叉验证或样本外分析?

据我所知,我可以使用sklearnand GridSearchCV,但随后我需要指定权重和基本边距XGBRegressor()(而不是fit()上面的 in)。base_marginin的等价物XGBRegressor()是参数base_score,但没有重量参数。

另外,我可能会忘记进行交叉验证,而只使用训练和测试数据集,然后我会eval_set在 中使用参数XGBRegressor(),但如果我这样做,就无法指定什么是权重以及什么是基本边距不同的集合。

非常感谢任何正确方向的指导!

python weighted cross-validation xgboost

6
推荐指数
1
解决办法
2987
查看次数