我是 scikit 的新手,在结合数据比例和网格搜索方面有两个小问题。
考虑使用 Kfolds 进行交叉验证,我希望每次我们在 K-1 折叠上训练模型时,数据缩放器(例如使用 preprocessing.StandardScaler())仅适用于 K-1 折叠,然后应用于剩下的折叠。
我的印象是以下代码将适合整个数据集上的缩放器,因此我想修改它以使其按照先前描述的方式运行:
classifier = svm.SVC(C=1)
clf = make_pipeline(preprocessing.StandardScaler(), classifier)
tuned_parameters = [{'C': [1, 10, 100, 1000]}]
my_grid_search = GridSearchCV(clf, tuned_parameters, cv=5)
Run Code Online (Sandbox Code Playgroud)
当 refit=True 时,“在”网格搜索之后,在整个数据集上重新拟合模型(使用最佳估计器),我的理解是将再次使用管道,因此缩放器将适合整个数据集。理想情况下,我想重用它来扩展我的“测试”数据集。有没有办法直接从 GridSearchCV 中检索它?
我工作的一个文本分类的问题,我已经设置了像这样(我已经离开了为简洁的数据处理步骤,但他们会产生一种叫做数据帧data的柱子X和y):
import sklearn.model_selection as ms
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
sim = Pipeline([('vec', TfidfVectorizer((analyzer="word", ngram_range=(1, 2))),
("rdf", RandomForestClassifier())])
Run Code Online (Sandbox Code Playgroud)
现在我尝试通过对2/3的数据进行训练并在剩余的1/3上对其进行评分来验证此模型,如下所示:
train, test = ms.train_test_split(data, test_size = 0.33)
sim.fit(train.X, train.y)
sim.score(test.X, test.y)
# 0.533333333333
Run Code Online (Sandbox Code Playgroud)
我想为三个不同的测试集做三次,但使用cross_val_score给我的结果要低得多.
ms.cross_val_score(sim, data.X, data.y)
# [ 0.29264069 0.36729223 0.22977941]
Run Code Online (Sandbox Code Playgroud)
据我所知,该阵列中的每个分数都应该通过对2/3数据的训练产生,并使用该sim.score方法对剩余的1/3进行评分.那他们为什么都这么低?
我正在阅读有关交叉验证以及如何使用它来选择最佳模型和估计参数的内容,但我并没有真正理解它的含义。
假设我建立一个线性回归模型并进行 10 倍交叉验证,我认为这 10 个中的每一个都会有不同的系数值,现在我应该从 10 个不同的系数中选择哪个作为我的最终模型或估计参数。
或者我们使用交叉验证只是为了找到平均误差(在我们的例子中是 10 个模型的平均值)并与另一个模型进行比较?
validation statistics machine-learning cross-validation statistics-bootstrap
我刚刚阅读了k-fold交叉验证,并意识到我无意中使用当前的预处理设置泄漏数据.
通常,我有一个火车和测试数据集.我在整个火车数据集上做了一堆数据插补和一次热编码,然后运行k-fold交叉验证.
泄漏是因为,如果我正在进行5倍交叉验证,我将训练80%的列车数据,并在剩余的20%的列车数据上进行测试.
我真的应该根据80%的火车来估算20%(而我之前使用的是100%的数据).
1)这是考虑交叉验证的正确方法吗?
2)我一直在研究这个Pipeline类sklearn.pipeline,它似乎对做一堆变换很有用,然后最终将模型拟合到结果数据中.但是,我正在做一些像" float64用平均值列出缺失数据"这样的东西,"用模式归还所有其他数据",等等.
这种插补没有明显的变压器.我该如何将这一步添加到Pipeline?我会创建自己的子类BaseEstimator吗?
这里的任何指导都会很棒!
我是机器学习的新手。
我正在尝试进行多标签文本分类。我有这些文档的原始标签以及分类结果(使用 mlknn 分类器)表示为一种热编码(19000 文档 x 200 标签)。现在我正在尝试使用 f1_score micro 和 macro 来评估分类,但是我收到了这个错误(在第 3 行)ValueError: Classification metrics can't handle a mix of multiclass-multioutput and multilabel-indicator targets,我不知道如何解决它。这是我的代码:
1. y_true = np.loadtxt("target_matrix.txt")
2. y_pred = np.loadtxt("classification_results.txt")
3. print (f1_score(y_true, y_pred, average='macro'))
4. print (f1_score(y_true, y_pred, average='micro'))
Run Code Online (Sandbox Code Playgroud)
我还尝试使用cross_val_score分类来立即进行评估,但遇到了另一个错误(来自cross_val_score行):
File "_csparsetools.pyx", line 20, in scipy.sparse._csparsetools.lil_get1
File "_csparsetools.pyx", line 48, in scipy.sparse._csparsetools.lil_get1
IndexError: column index (11) out of bounds
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
X = np.loadtxt("docvecs.txt", delimiter=",")
y = np.loadtxt("target_matrix.txt", dtype='int')
cv_scores …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) 我正在关注Kaggle的一个内核,主要是,我正在关注信用卡欺诈检测的内核.
我到达了需要执行KFold的步骤,以便找到Logistic回归的最佳参数.
以下代码显示在内核本身,但由于某种原因(可能是旧版本的scikit-learn,给我一些错误).
def printing_Kfold_scores(x_train_data,y_train_data):
fold = KFold(len(y_train_data),5,shuffle=False)
# Different C parameters
c_param_range = [0.01,0.1,1,10,100]
results_table = pd.DataFrame(index = range(len(c_param_range),2), columns = ['C_parameter','Mean recall score'])
results_table['C_parameter'] = c_param_range
# the k-fold will give 2 lists: train_indices = indices[0], test_indices = indices[1]
j = 0
for c_param in c_param_range:
print('-------------------------------------------')
print('C parameter: ', c_param)
print('-------------------------------------------')
print('')
recall_accs = []
for iteration, indices in enumerate(fold,start=1):
# Call the logistic regression model with a certain C parameter
lr = …Run Code Online (Sandbox Code Playgroud) 我想使用一个自定义函数,cross_validate它使用特定y_test的计算精度,这y_test与实际目标不同y_test。
我尝试了几种方法,make_scorer但我不知道如何实际通过我的替代方法y_test:
scoring = {'prec1': 'precision',
'custom_prec1': make_scorer(precision_score()}
scores = cross_validate(pipeline, X, y, cv=5,scoring= scoring)
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议一种方法吗?
当我通过交叉验证训练 SVC 时,
y_pred = cross_val_predict(svc, X, y, cv=5, method='predict')
Run Code Online (Sandbox Code Playgroud)
cross_val_predict返回 X 中每个元素的一个类预测,因此y_pred.shape = (1000,)当m=1000. 这是有道理的,因为cv=5SVC 在 X 的不同部分上进行了 5 次训练和验证。在这五次验证中,每一次都对五分之一的实例进行了预测 ( m/5 = 200)。随后,将 5 个向量(每个向量包含 200 个预测)合并为y_pred.
y_pred考虑到所有这些,我使用和 y计算 SVC 的整体精度是合理的。
score = accuracy_score(y, y_pred)
Run Code Online (Sandbox Code Playgroud)
但是(!)cross_val_predict声明的文档:
cross_val_predict 的结果可能与使用 cross_val_score 获得的结果不同,因为元素以不同的方式分组。函数 cross_val_score 取交叉验证折叠的平均值,而 cross_val_predict 只是简单地返回来自几个不同模型的标签(或概率)。因此,cross_val_predict 不是泛化误差的适当度量。
有人可以换句话解释一下,为什么cross_val_predict不适合测量泛化误差,例如 via accuracy_score(y, y_pred)?
编辑:
我首先假设在cv=55 个验证中的每一个都会对 X 的所有实例进行预测。但这是错误的,每次验证仅对 X 的 1/5 实例进行预测。
我正在做多类/多标签文本分类。我试图摆脱“ConvergenceWarning”。
当我将max_iter从默认值调整为4000 时,警告消失了。然而,我的模型精度从78降低到75。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
logreg = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', LogisticRegression(n_jobs=1, C=1e5, solver='lbfgs',multi_class='ovr' ,random_state=0, class_weight='balanced' )),
])
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print('Logistic Regression Accuracy %s' % accuracy_score(y_pred, y_test))
cv_score = cross_val_score(logreg, train_tfidf, y_train, cv=10, scoring='accuracy')
print("CV Score : Mean : %.7g | Std : %.7g | Min : %.7g | Max : %.7g" % (np.mean(cv_score),np.std(cv_score),np.min(cv_score),np.max(cv_score)))
Run Code Online (Sandbox Code Playgroud)
为什么当 max_iter = 4000 时我的准确率会降低?有没有其他方法可以修复 *“ConvergenceWarning:lbfgs 未能收敛。增加迭代次数。“迭代次数。”,ConvergenceWarning)”*
python cross-validation logistic-regression multiclass-classification
cross-validation ×10
python ×8
scikit-learn ×7
grid-search ×2
pipeline ×2
python-3.x ×1
statistics ×1
svm ×1
validation ×1