我在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 …
我试图使用GridSearchCVfor RandomForestRegressor,但总是得到ValueError: Found array with dim 100. Expected 500. 考虑这个玩具示例:
import numpy as np
from sklearn import ensemble
from sklearn.cross_validation import train_test_split
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import r2_score
if __name__ == '__main__':
X = np.random.rand(1000, 2)
y = np.random.rand(1000)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.5, random_state=1)
# Set the parameters by cross-validation
tuned_parameters = {'n_estimators': [500, 700, 1000], 'max_depth': [None, 1, 2, 3], 'min_samples_split': [1, 2, 3]}
# clf = …Run Code Online (Sandbox Code Playgroud) 我最近发现了folds参数in xgb.cv,它允许指定验证集的索引.xgb.cv.mknfold然后在xgb.cv其中调用辅助函数,然后将每个折叠的剩余索引作为相应折叠的训练集的索引.
问题:我可以通过xgboost接口中的任何接口指定训练和验证索引吗?
我的主要动机是执行时间序列交叉验证,我不希望将"非验证"索引自动指定为训练数据.举例说明我想做的事情:
# assume i have 100 strips of time-series data, where each strip is X_i
# validate only on 10 points after training
fold1: train on X_1-X_10, validate on X_11-X_20
fold2: train on X_1-X_20, validate on X_21-X_30
fold3: train on X_1-X_30, validate on X_31-X_40
...
Run Code Online (Sandbox Code Playgroud)
目前,使用该folds参数将迫使我使用剩余的示例作为验证集,这极大地增加了误差估计的方差,因为剩余数据大大超过训练数据并且可能具有与训练数据非常不同的分布,尤其是对于训练数据.较早的折叠.这就是我的意思:
fold1: train on X_1-X_10, validate on X_11-X100 # huge error
...
Run Code Online (Sandbox Code Playgroud)
如果它们方便(即不要求我撬开源代码)并且不会使原始xgboost实现中的效率无效,我对其他软件包的解决方案持开放态度.
我正在尝试使用SciKit-Learn执行我的第一个KNN分类器.我一直在关注用户指南和其他在线示例,但有一些我不确定的事情.对于这篇文章,我们使用以下内容
X =数据Y =目标
1)在我读过的机器学习页面的大多数介绍中,似乎说你想要一个训练集,一个验证集和一个测试集.根据我的理解,交叉验证允许您组合训练和验证集来训练模型,然后您应该在测试集上测试它以获得分数.但是,我在论文中看到,在很多情况下,您只需对整个数据集进行交叉验证,然后将CV分数报告为准确性.我理解在一个理想的世界中你会想要测试单独的数据,但如果这是合法的,我想在我的整个数据集上交叉验证并报告这些分数
2)开始这个过程
我将KNN分类器定义如下
knn = KNeighborsClassifier(algorithm = 'brute')
Run Code Online (Sandbox Code Playgroud)
我使用搜索最好的n_neighbors
clf = GridSearchCV(knn, parameters, cv=5)
Run Code Online (Sandbox Code Playgroud)
现在,如果我说
clf.fit(X,Y)
Run Code Online (Sandbox Code Playgroud)
我可以使用检查最佳参数
clf.best_params_
Run Code Online (Sandbox Code Playgroud)
然后我就能得分
clf.score(X,Y)
Run Code Online (Sandbox Code Playgroud)
但是 - 据我所知,这还没有交叉验证模型,因为它只给出1分?
如果我看到clf.best_params_ = 14,我现在可以继续
knn2 = KNeighborsClassifier(n_neighbors = 14, algorithm='brute')
cross_val_score(knn2, X, Y, cv=5)
Run Code Online (Sandbox Code Playgroud)
现在我知道数据已经过交叉验证,但我不知道使用clf.fit找到最佳参数是否合法,然后将cross_val_score与新的knn模型一起使用?
3)我理解这样做的"正确"方法如下
拆分为X_train,X_test,Y_train,Y_test,比例训练集 - >将转换应用于测试集
knn = KNeighborsClassifier(algorithm = 'brute')
clf = GridSearchCV(knn, parameters, cv=5)
clf.fit(X_train,Y_train)
clf.best_params_
Run Code Online (Sandbox Code Playgroud)
然后我就能得分
clf.score(X_test,Y_test)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用最佳参数计算得分吗?
我希望这是有道理的.我一直试图尽可能多地找到我没有发布但我已经到了我认为更容易得到一些直接答案的地步.
在我的脑海中,我试图使用整个数据集获得一些交叉验证的分数,但也使用gridsearch(或类似的东西)来微调参数.
提前致谢
有没有办法设置sklearn的cross_val_score阈值?
我训练了一个模型,然后将阈值调整为 0.22。型号如下:
# Try with Threshold
pred_proba = LGBM_Model.predict_proba(X_test)
# Adjust threshold for predictions proba
prediction_with_threshold = []
for item in pred_proba[:,0]:
if item > 0.22 :
prediction_with_threshold.append(0)
else:
prediction_with_threshold.append(1)
print(classification_report(y_test,prediction_with_threshold))
Run Code Online (Sandbox Code Playgroud)
然后我想使用 cross_val_score 验证这个模型。我已经搜索过,但找不到设置 cross_val_score 阈值的方法。我使用的 cross_val_score 如下所示:
F1Scores = cross_val_score(LGBMClassifier(random_state=101,learning_rate=0.01,max_depth=-1,min_data_in_leaf=60,num_iterations=200,num_leaves=70),X,y,cv=5,scoring='f1')
F1Scores
### how to adjust threshold to 0.22 ??
Run Code Online (Sandbox Code Playgroud)
或者还有其他方法使用阈值验证该模型?
我对使用 python sklearn 的数据集进行了 10 倍交叉验证,
result = cross_val_score(best_svr, X, y, cv=10, scoring='r2')
print(result.mean())
Run Code Online (Sandbox Code Playgroud)
我已经能够得到 r2 分数的平均值作为最终结果。我想知道是否有办法打印出每个折叠的预测值(在本例中为 10 组值)。
我正在尝试使用卷积神经网络(CNN)进行图像分类。我想使用 KFold 交叉验证进行数据训练和测试。我是新手,我真的不明白该怎么做。
我已经在单独的代码中尝试过 KFold 交叉验证和 CNN。而且我不知道如何将其结合起来。
我使用 iris_data.csv 和 3 个类作为输入示例。
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVR
dataset = pd.read_csv('iris_data.csv')
x = dataset.iloc[:,0:3]
y = dataset.iloc[:, 4]
scaler = MinMaxScaler(feature_range=(0, 1))
x = scaler.fit_transform(x)
cv = KFold(n_splits=10, shuffle=False)
for train_index, test_index in cv.split(x):
print("Train Index: ", train_index, "\n")
print("Test Index: ", test_index)
x_train, x_test, y_train, y_test = x[train_index], x[test_index], y[train_index], y[test_index]
Run Code Online (Sandbox Code Playgroud)
这里是 CNN 代码示例。
import …Run Code Online (Sandbox Code Playgroud) python image-processing cross-validation conv-neural-network
我有一个旧的线性模型,我希望使用 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(),但如果我这样做,就无法指定什么是权重以及什么是基本边距不同的集合。
非常感谢任何正确方向的指导!
cross-validation ×10
python ×6
scikit-learn ×5
r ×3
xgboost ×2
grid-search ×1
knn ×1
regression ×1
rpart ×1
time-series ×1
tree ×1
weighted ×1