我在sklearn中使用Lasso方法执行线性回归.
根据他们的指导,以及我在其他地方看到的内容,建议将其分解为更传统的训练集/验证集分区,而不是简单地对所有训练数据进行交叉验证.
因此,对训练集训练套索,然后根据验证集的交叉验证结果调整超参数α.最后,在测试集上使用接受的模型,以给出一个真实的视图哦它将如何在现实中执行.在这里分离问题是防止过度拟合的预防措施.
实际问题
Lasso CV是否符合上述协议,或者只是以某种方式在同一数据和/或同一轮CV中训练模型参数和超参数?
谢谢.
我想使用交叉验证来测试/训练我的数据集,并评估逻辑回归模型在整个数据集上的性能,而不仅仅是在测试集上(例如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) 我正在使用来自scikit-learn的StratifiedKFold,但现在我还要注意"团体".有很好的功能GroupKFold,但我的数据非常依赖于时间.与帮助中的相似,即周数是分组索引.但每周应该只有一个折叠.
假设我需要10倍.在我可以使用GroupKFold之前,我需要先将数据混洗.
洗牌是小组的 - 所以整个小组应该互相洗牌.
有办法做的是scikit - 以某种方式学习优雅吗?在我看来,GroupKFold首先可以自动调整数据.
如果没有办法用scikit做,有人可以写一些有效的代码吗?我有大量的数据集.
矩阵,标签,组作为输入
是否可以通过一些解决方法从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
我在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
我正在进行基于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比较陌生。您可以帮助我将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中,我正在研究旅行保险欺诈检测的二进制分类问题。这是我的数据集的特征:
指标是精度,召回率和F2得分。我们将重点更多地放在避免误报上,因此,我们非常赞赏召回率很高。作为预处理,我使用SMOTE-NC对肯定的案例进行了超采样,这也考虑了分类变量。
在尝试了包括自我训练的半监督学习和标签传播/标签传播等方法之后,我获得了较高的回忆得分(培训中80%,测试中65-70%)。但是,我的精度得分显示出过拟合的痕迹(训练时为60-70%,测试时为10%)。我知道精度在训练上是好的,因为它是重新采样的,而测试数据则很低,因为它直接反映了测试数据中类的不平衡。但是这个精度分数太低了,所以我想解决它。
因此,为了简化模型,我正在考虑应用降维。我找到了一个名为princeFAMD 的软件包 (混合物数据的因子分析)。
问题1:我应该如何进行标准化,FAMD,k倍交叉验证和重采样?我下面的方法正确吗?
问题2:包prince不具有的方法,例如fit或transform等中Sklearn,所以无法执行第三步骤如下所述。任何其他包好做fit,并transform为FAMD?还有没有其他好的方法可以减少此类数据集的维数?
我的方法:
*对于我对这个问题的整体处理方法的各种建议,我也将不胜感激
谢谢!
classification resampling pca factor-analysis cross-validation
基于递归特征消除和使用scikit-learn的网格搜索,我知道RFECV可以结合使用GridSearchCV以获得更好的模型参数设置,如线性SVM.
如答案所述,有两种方法:
"在RFECV上运行GridSearchCV,这将导致数据分成两次折叠(GridSearchCV内部和RFECV内部),但搜索组件数量将是有效的."
"GridSearchCV仅针对RFE,这将导致数据的单一分割,但是对RFE估计器的参数进行非常低效的扫描."
为了使我的问题清楚,我必须首先澄清RFECV:
将整个数据拆分为n个折叠.
在每个折叠中,通过仅拟合训练数据来获得特征等级rfe.
对排名进行排序并使训练数据适合SVM并在测试数据上进行测试以进行评分.这应该进行m次,每次都有减少的特征数量,其中m是假设的特征数量step=1.
在前一步骤中获得一系列得分,并且在步骤1~3已经进行n次之后,这样的序列将最后在n次折叠中平均,得到平均评分序列,表明要做的最佳特征数rfe.
以功能最数目的参数n_features_to_select在rfe装有原始整个数据.
.support_获得特色中的"赢家"; .grid_scores_得到平均得分序列.
所以我的问题是在哪里放置GridSearchCV?我猜第二种方式"在RFE上做GridSearchCV"是在第5步做GridSearchCV,它将SVM的参数设置为网格中的一个值,使其适合GridSearchCV分割的训练数据,以获得步骤中建议的功能数量4,并用其余的数据进行测试以获得分数.这样的过程在k次完成,平均得分表示网格中该值的良好性,其中k是cvGridSearchCV中的参数.但是,由于替代训练数据和网格值,所选功能可能会有所不同,如果按照我的猜测完成,则第二种方式不合理.
GridSearchCV实际上如何与RFECV结合?
我确信在运行 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)
cross-validation ×10
scikit-learn ×8
python ×6
grid-search ×2
glmnet ×1
pca ×1
pipeline ×1
r ×1
regression ×1
resampling ×1
shuffle ×1
tf-idf ×1