标签: cross-validation

LassoCV如何在scikit中学习分区数据?

我在sklearn中使用Lasso方法执行线性回归.

根据他们的指导,以及我在其他地方看到的内容,建议将其分解为更传统的训练集/验证集分区,而不是简单地对所有训练数据进行交叉验证.

因此,对训练集训练套索,然后根据验证集的交叉验证结果调整超参数α.最后,在测试集上使用接受的模型,以给出一个真实的视图哦它将如何在现实中执行.在这里分离问题是防止过度拟合的预防措施.

实际问题

Lasso CV是否符合上述协议,或者只是以某种方式在同一数据和/或同一轮CV中训练模型参数和超参数?

谢谢.

python regression scikit-learn cross-validation

8
推荐指数
1
解决办法
6055
查看次数

使用交叉验证评估Logistic回归

我想使用交叉验证来测试/训练我的数据集,并评估逻辑回归模型在整个数据集上的性能,而不仅仅是在测试集上(例如25%).

这些概念对我来说是全新的,我不确定它是否做得对.如果有人能告诉我正确的步骤,我会在错误的地方采取行动,我将不胜感激.我的部分代码如下所示.

另外,如何在当前图形的同一图形上绘制"y2"和"y3"的ROC?

谢谢

import pandas as pd 
Data=pd.read_csv ('C:\\Dataset.csv',index_col='SNo')
feature_cols=['A','B','C','D','E']
X=Data[feature_cols]

Y=Data['Status'] 
Y1=Data['Status1']  # predictions from elsewhere
Y2=Data['Status2'] # predictions from elsewhere

from sklearn.linear_model import LogisticRegression
logreg=LogisticRegression()
logreg.fit(X_train,y_train)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

from sklearn import metrics, cross_validation
predicted = cross_validation.cross_val_predict(logreg, X, y, cv=10)
metrics.accuracy_score(y, predicted) 

from sklearn.cross_validation import cross_val_score
accuracy = cross_val_score(logreg, X, y, cv=10,scoring='accuracy')
print (accuracy)
print (cross_val_score(logreg, X, y, cv=10,scoring='accuracy').mean())

from nltk import ConfusionMatrix 
print (ConfusionMatrix(list(y), list(predicted)))
#print …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn cross-validation logistic-regression

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

Scikit-learn,GroupKFold与洗牌组合?

我正在使用来自scikit-learn的StratifiedKFold,但现在我还要注意"团体".有很好的功能GroupKFold,但我的数据非常依赖于时间.与帮助中的相似,即周数是分组索引.但每周应该只有一个折叠.

假设我需要10倍.在我可以使用GroupKFold之前,我需要先将数据混洗.

洗牌是小组的 - 所以整个小组应该互相洗牌.

有办法做的是scikit - 以某种方式学习优雅吗?在我看来,GroupKFold首先可以自动调整数据.

如果没有办法用scikit做,有人可以写一些有效的代码吗?我有大量的数据集.

矩阵,标签,组作为输入

python shuffle scikit-learn cross-validation

8
推荐指数
1
解决办法
3040
查看次数

SKlearn中具有嵌套交叉验证的分类报告

是否可以通过一些解决方法从cross_val_score获取分类报告?我正在使用嵌套交叉验证,我可以在这里获得一个模型的各种分数,但是,我想看到外循环的分类报告.有什么建议?

# Choose cross-validation techniques for the inner and outer loops,
# independently of the dataset.
# E.g "LabelKFold", "LeaveOneOut", "LeaveOneLabelOut", etc.
inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

# Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svr, param_grid=p_grid, cv=inner_cv)

# Nested CV with parameter optimization
nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
Run Code Online (Sandbox Code Playgroud)

我想在评分值旁边看到分类报告. http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html

classification machine-learning scikit-learn cross-validation

8
推荐指数
2
解决办法
4452
查看次数

使用网格搜索的交叉验证返回比默认值更差的结果

我在Python中使用scikitlearn来运行一些基本的机器学习模型.使用内置的GridSearchCV()函数,我确定了不同技术的"最佳"参数,但其中许多都比默认值更差.我包含默认参数作为选项,所以我很惊讶这会发生.

例如:

from sklearn import svm, grid_search
from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(verbose=1)
parameters = {'learning_rate':[0.01, 0.05, 0.1, 0.5, 1],  
              'min_samples_split':[2,5,10,20], 
              'max_depth':[2,3,5,10]}
clf = grid_search.GridSearchCV(gbc, parameters)
t0 = time()
clf.fit(X_crossval, labels)
print "Gridsearch time:", round(time() - t0, 3), "s"
print clf.best_params_
# The output is: {'min_samples_split': 2, 'learning_rate': 0.01, 'max_depth': 2}
Run Code Online (Sandbox Code Playgroud)

这与默认值相同,但max_depth为3.当我使用这些参数时,我得到72%的准确度,而默认值为78%.

我做的一件事,我承认是可疑的,是我使用我的整个数据集进行交叉验证.然后在获得参数后,我使用相同的数据集运行它,分成75-25训练/测试.

我的网格搜索是否有理由忽视"优越"默认值?

python machine-learning scikit-learn cross-validation grid-search

8
推荐指数
1
解决办法
2690
查看次数

我是否在k-fold cross_validation中使用相同的Tfidf词汇表

我正在进行基于TF-IDF向量空间模型的文本分类.我只有不超过3000个样本.为了公平评估,我正在使用5倍交叉验证来评估分类器.但令我困惑的是,是否有必要TF-IDF在每个折叠交叉验证中重建向量空间模型.也就是说,我是否需要重建词汇表并重新计算IDF每个折叠交叉验证中的词汇量值?

目前我正在基于scikit-learn工具包进行TF-IDF转换,并使用SVM训练我的分类器.我的方法如下:首先,我将手中的样本除以3:1的比例,75%的样本用于拟合TF-IDF向量空间模型的参数.Herein,参数是大小词汇及其中包含的术语,也是IDF词汇中每个术语的价值.然后我在这里转换剩余部分TF-IDF SVM并使用这些向量进行5倍交叉验证(值得注意的是,我不使用之前的75%的样本用于转化).

我的代码如下:

# train, test split, the train data is just for TfidfVectorizer() fit
x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, train_size=0.75, random_state=0)
tfidf = TfidfVectorizer()
tfidf.fit(x_train)

# vectorizer test data for 5-fold cross-validation
x_test = tfidf.transform(x_test)

 scoring = ['accuracy']
 clf = SVC(kernel='linear')
 scores = cross_validate(clf, x_test, y_test, scoring=scoring, cv=5, return_train_score=False)
 print(scores)
Run Code Online (Sandbox Code Playgroud)

我的困惑在于,我的方法是进行TF-IDF转换和进行5倍交叉验证是否正确,或者是否有必要TF-IDF使用列车数据重建矢量模型空间,然后转换为TF-IDF包含列车和测试数据的向量?如下:

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_index, test_index in …
Run Code Online (Sandbox Code Playgroud)

python tf-idf scikit-learn cross-validation

8
推荐指数
1
解决办法
1152
查看次数

如何在交叉验证和GridSearchCV中实现SMOTE

我对Python比较陌生。您可以帮助我将SMOTE的实施改进到适当的流程吗?我想要的是对每k倍迭代的训练集应用过采样和欠采样,以便在平衡的数据集上训练模型,并在不平衡的遗漏片段上进行评估。问题是,当我这样做时,无法使用熟悉的sklearn界面进行评估和网格搜索。

有可能做类似的事情吗model_selection.RandomizedSearchCV?我对此:

df = pd.read_csv("Imbalanced_data.csv") #Load the data set
X = df.iloc[:,0:64]
X = X.values
y = df.iloc[:,64]
y = y.values
n_splits = 2
n_measures = 2 #Recall and AUC
kf = StratifiedKFold(n_splits=n_splits) #Stratified because we need balanced samples
kf.get_n_splits(X)
clf_rf = RandomForestClassifier(n_estimators=25, random_state=1)
s =(n_splits,n_measures)
scores = np.zeros(s)
for train_index, test_index in kf.split(X,y):
   print("TRAIN:", train_index, "TEST:", test_index)
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]
   sm = SMOTE(ratio = 'auto',k_neighbors = 5, n_jobs …
Run Code Online (Sandbox Code Playgroud)

python pipeline scikit-learn cross-validation grid-search

8
推荐指数
1
解决办法
4901
查看次数

降维,归一化,重采样,k倍CV ...按什么顺序?

在Python中,我正在研究旅行保险欺诈检测的二进制分类问题。这是我的数据集的特征:

  • 包含40,000个具有20个功能的样本。一次热编码后,特征数量为50(4个数字,46个分类)。
  • 多数未标记:在40,000个样本中,有33,000个样本未标记。
  • 高度不平衡:在7,000个标记的样本中,只有800个样本(11%)为阳性(欺诈)。

指标是精度,召回率和F2得分。我们将重点更多地放在避免误报上,因此,我们非常赞赏召回率很高。作为预处理,我使用SMOTE-NC对肯定的案例进行了超采样,这也考虑了分类变量。

在尝试了包括自我训练的半监督学习和标签传播/标签传播等方法之后,我获得了较高的回忆得分(培训中80%,测试中65-70%)。但是,我的精度得分显示出过拟合的痕迹(训练时为60-70%,测试时为10%)。我知道精度在训练上是好的,因为它是重新采样的,而测试数据则很低,因为它直接反映了测试数据中类的不平衡。但是这个精度分数太低了,所以我想解决它。

因此,为了简化模型,我正在考虑应用降维。我找到了一个名为princeFAMD 的软件包 (混合物数据的因子分析)。

问题1:我应该如何进行标准化,FAMD,k倍交叉验证和重采样?我下面的方法正确吗?

问题2:包prince不具有的方法,例如fittransform等中Sklearn,所以无法执行第三步骤如下所述。任何其他包好做fit,并transform为FAMD?还有没有其他好的方法可以减少此类数据集的维数?

我的方法:

  1. 制作k折并隔离其中之一进行验证,其余部分用于训练
  2. 归一化训练数据并转换验证数据
  3. 使FAMD适合训练数据,并转换训练和测试数据
  4. 使用SMOTE-NC仅重新采样训练数据
  5. 训练模型是什么,根据验证数据进行评估
  6. 重复2-5 k次并取平均值,取回F2分数

*对于我对这个问题的整体处理方法的各种建议,我也将不胜感激

谢谢!

classification resampling pca factor-analysis cross-validation

8
推荐指数
0
解决办法
100
查看次数

具有RFECV的GridSearchCV在sklearn中的含义

基于递归特征消除和使用scikit-learn的网格搜索,我知道RFECV可以结合使用GridSearchCV以获得更好的模型参数设置,如线性SVM.

如答案所述,有两种方法:

  • "在RFECV上运行GridSearchCV,这将导致数据分成两次折叠(GridSearchCV内部和RFECV内部),但搜索组件数量将是有效的."

  • "GridSearchCV仅针对RFE,这将导致数据的单一分割,但是对RFE估计器的参数进行非常低效的扫描."

为了使我的问题清楚,我必须首先澄清RFECV:

  1. 将整个数据拆分为n个折叠.

  2. 在每个折叠中,通过仅拟合训练数据来获得特征等级rfe.

  3. 对排名进行排序并使训练数据适合SVM并在测试数据上进行测试以进行评分.这应该进行m次,每次都有减少的特征数量,其中m是假设的特征数量step=1.

  4. 在前一步骤中获得一系列得分,并且在步骤1~3已经进行n次之后,这样的序列将最后在n次折叠中平均,得到平均评分序列,表明要做的最佳特征数rfe.

  5. 以功能最数目的参数n_features_to_selectrfe装有原始整个数据.

  6. .support_获得特色中的"赢家"; .grid_scores_得到平均得分序列.

  7. 如果我错了请纠正我,谢谢.

所以我的问题是在哪里放置GridSearchCV?我猜第二种方式"在RFE上做GridSearchCV"是在第5步做GridSearchCV,它将SVM的参数设置为网格中的一个值,使其适合GridSearchCV分割的训练数据,以获得步骤中建议的功能数量4,并用其余的数据进行测试以获得分数.这样的过程在k次完成,平均得分表示网格中该值的良好性,其中k是cvGridSearchCV中的参数.但是,由于替代训练数据和网格值,所选功能可能会有所不同,如果按照我的猜测完成,则第二种方式不合理.

GridSearchCV实际上如何与RFECV结合?

feature-selection scikit-learn cross-validation

7
推荐指数
0
解决办法
1120
查看次数

从 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
查看次数