标签: gridsearchcv

在 scikit learn 中实现自定义损失函数

我想在 scikit learn 中实现自定义损失函数。我使用以下代码片段:

def my_custom_loss_func(y_true,y_pred):
   diff3=max((abs(y_true-y_pred))*y_true)
   return diff3

score=make_scorer(my_custom_loss_func,greater_ is_better=False)
clf=RandomForestRegressor()
mnn= GridSearchCV(clf,score)
knn = mnn.fit(feam,labm) 
Run Code Online (Sandbox Code Playgroud)

传入的参数应该是什么my_custom_loss_func?我的标签矩阵称为labm. 我想计算实际输出和预测输出(通过模型)乘以真实输出之间的差异。如果我用labm代替y_true,我应该用什么代替y_pred

python machine-learning scikit-learn data-science gridsearchcv

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

使用gridsearchcv的内存泄漏

问题:运行gridsearchcv时,我的情况似乎是内存泄漏。当我使用1个或32个并发工作程序(n_jobs = -1)运行时,会发生这种情况。以前,我在ubuntu 16.04上运行了很多次,没有任何问题,但最近升级到了18.04,并进行了ram升级。

import os
import pickle
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV,StratifiedKFold,train_test_split
from sklearn.calibration import CalibratedClassifierCV
from sklearn.metrics import make_scorer,log_loss
from horsebet import performance
scorer = make_scorer(log_loss,greater_is_better=True)
kfold = StratifiedKFold(n_splits=3)

# import and split data
input_vectors = pickle.load(open(os.path.join('horsebet','data','x_normalized'),'rb'))
output_vector = pickle.load(open(os.path.join('horsebet','data','y'),'rb')).ravel()
x_train,x_test,y_train,y_test = train_test_split(input_vectors,output_vector,test_size=0.2)


# XGB
model = XGBClassifier()
param = {
        'booster':['gbtree'],
        'tree_method':['hist'],
       'objective':['binary:logistic'],
        'n_estimators':[100,500],
        'min_child_weight': [.8,1],
        'gamma': [1,3],
        'subsample': [0.1,.4,1.0],
        'colsample_bytree': [1.0],
        'max_depth': [10,20],
        }                           

jobs = 8
model = GridSearchCV(model,param_grid=param,cv=kfold,scoring=scorer,pre_dispatch=jobs*2,n_jobs=jobs,verbose=5).fit(x_train,y_train)
Run Code Online (Sandbox Code Playgroud)

返回值: UserWarning:当一些作业交给执行者时,一个工人停止了。这可能是由于工作者超时时间太短或内存泄漏引起的。“超时或由于内存泄漏。”,UserWarning …

memory-leaks scikit-learn grid-search gridsearchcv

9
推荐指数
1
解决办法
2030
查看次数

在哪里设置n_job:估计器或GridSearchCV?

我经常用于GridSearchCV超参数调整。例如,用于调整逻辑回归C中的正则化参数。每当我使用的估计器有自己的参数时,我都会很困惑在哪里设置它,是在估计器中还是在 中,还是在两者中?同样的情况也适用于.n_jobsGridSearchCVcross_validate

python machine-learning scikit-learn gridsearchcv

9
推荐指数
1
解决办法
1163
查看次数

如何访问 GridSearchCV 中的 ColumnTransformer 元素

当引用 grid_search 的 param_grid 中的 ColumnTransformer (它是管道的一部分)中包含的单个预处理器时,我想找出正确的命名约定。

环境和样本数据:

import seaborn as sns
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, KBinsDiscretizer, MinMaxScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

df = sns.load_dataset('titanic')[['survived', 'age', 'embarked']]
X_train, X_test, y_train, y_test = train_test_split(df.drop(columns='survived'), df['survived'], test_size=0.2, 
                                                    random_state=123)
Run Code Online (Sandbox Code Playgroud)

管道:

num = ['age']
cat = ['embarked']

num_transformer = Pipeline(steps=[('imputer', SimpleImputer()), 
                                  ('discritiser', KBinsDiscretizer(encode='ordinal', strategy='uniform')),
                                  ('scaler', MinMaxScaler())])

cat_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
                                  ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(transformers=[('num', num_transformer, …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn grid-search gridsearchcv

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

我在修改玩具 scikit-learn gridsearchCV 示例时收到警告“UserWarning:一个或多个测试分数是非限定的”

我有以下代码可以正常工作但得到了一个

UserWarning: One or more of the test scores are non-finite: [nan nan]
  category=UserWarning
Run Code Online (Sandbox Code Playgroud)

当我将其修改为更简洁的版本时(显示在随后的代码片段中)。单热编码器的输出是问题的罪魁祸首吗?

import pandas as pd
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import RidgeClassifier
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.model_selection import GridSearchCV

train = pd.read_csv('/train.csv')
test = pd.read_csv('/test.csv')
sparse_features = [col for col in train.columns if col.startswith('cat')]
dense_features = [col for col in train.columns if col not in sparse_features+['target']]
X = train.drop(['target'], axis=1)
y = train['target'].values
skf = StratifiedKFold(n_splits=5)
clf = RidgeClassifier() …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn gridsearchcv

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

如何修复 OneClassSVM 和 GridSearchCV 的错误“对于多指标评分”

我尝试使用 OnClassSVM 进行异常检测,并使用 GridSearchCV() 调整其参数,如下所示:

我已经搜索了许多网站,包括https://stackoverflow.com/但找不到适合我的场景的任何正确解决方案。代码在这里:

nus = [0.001, 0.01, 0.1, 1]
gammas = [0.001, 0.01, 0.1, 1]
scorers = {
  'precision_score': make_scorer(precision_score),
  'recall_score': make_scorer(recall_score),
 'accuracy_score': make_scorer(accuracy_score)
}

tuned_parameters = {'C': [1, 10, 100, 1000], 'kernel' : ['rbf','linear'], 
'gamma' : gammas, 'nu': nus}
tuned_ocsvm = svm.OneClassSVM()
ocsvm = GridSearchCV(estimator=svm.OneClassSVM(), 
param_grid=tuned_parameters, scoring=scorers,refit='false')
Run Code Online (Sandbox Code Playgroud)

但它给我的错误如下

对于多指标评分,参数 refit 必须设置为记分器键或可调用项,以使用整个数据上的最佳参数设置重新拟合估计器,并使 best_* 属性可用于该指标。如果不需要,则 refit 应显式设置为 False。“假”已通过

python machine-learning scikit-learn gridsearchcv

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

sklearn : FitFailedWarning : Estimator 拟合失败

如您所见,我在使用 sklearn ( lightgbm, GridSearchCV) 时遇到问题。请让我知道如何解决此错误。

我的代码如下:

import lightgbm as lgb
from lightgbm.sklearn import LGBMClassifier

estimator = lgb.LGBMClassifier()
param_grid = {
    'num_leaves': [15, 30, 60],
    'min_data_in_leaf': [18, 36, 72],
    'learning_rate': [0.05, 0.1, 0.2],
    'n_estimators': [4, 8, 16]
}

from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(estimator, param_grid, cv=5)
lgb_grid = grid.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)

它引发了这个错误:

/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details: 
ValueError: bad input shape (33120, 4) …
Run Code Online (Sandbox Code Playgroud)

scikit-learn lightgbm gridsearchcv

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

如何在 GridSearchCV 中正确选择最佳模型 - sklearn 和 caret 都做错了

考虑 3 个数据集训练/验证/测试。GridSearchCV()默认情况下选择具有最高交叉验证分数的最佳模型。在预测需要准确的现实环境中,这是选择最佳模型的可怕方法。原因是它应该如何使用:

  • 模型的训练集以学习数据集

  • Val 设置用于验证模型在训练集中学到的内容并更新参数/超参数以最大化验证分数。

  • 测试集 - 在未见过的数据上测试您的数据。

  • 最后,在实时环境中使用模型并记录结果,看看结果是否足以做出决策。令人惊讶的是,许多数据科学家仅仅选择验证分数最高的模型,就冲动地在生产中使用他们训练过的模型。我发现gridsearch选择的模型严重过度拟合,并且在预测看不见的数据方面比默认参数做得更差。

我的做法:

  • 手动训练模型并查看每个模型的结果(以某种循环方式,但效率不高)。这是非常手动且耗时的,但我得到的结果比gridsearch好得多。我希望这是完全自动化的。

  • 为我想要选择的每个超参数绘制验证曲线,然后选择显示训练集和验证集之间差异最小的超参数,同时最大化两者(即训练= 98%,验证= 78%确实很糟糕,但训练= 72% ,val=70% 是可以接受的)。

正如我所说,我想要一种更好的(自动化)方法来选择最佳模型。

我正在寻找什么样的答案:

我想最大化训练集和验证集中的分数,同时最小化训练集和验证集之间的分数差异。考虑以下网格搜索算法的示例:有两种模型:

Model A: train score = 99%, val score = 89%
Model B: train score = 80%, val score = 79%
Run Code Online (Sandbox Code Playgroud)

B 型是一个更可靠的模型,我随时都会选择 B 型而不是 A 型。它不太适合,并且预测是一致的。我们知道会发生什么。然而,gridsearch将选择模型 A,因为 val 分数更高。我发现这是一个常见问题,并且在互联网上没有找到任何解决方案。人们往往过于关注在学校学到的东西,而没有真正考虑选择过度拟合模型的后果。我看到了关于如何使用包中的gridsearch并让他们为您选择模型的冗余帖子,但没有看到如何实际选择最佳模型。

到目前为止,我的方法非常手动。我想要一种自动化的方式来做到这一点。

我目前所做的是这样的:

gs = GridSearchCV(model, params, cv=3).fit(X_train, y_train) # X_train and y_train consists …
Run Code Online (Sandbox Code Playgroud)

python r scikit-learn r-caret gridsearchcv

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

Scikit-learn 0.24.0 或更高版本中的 GridSearchCV 和 RandomizedSearchCV 不打印 n_jobs=-1 的进度日志

在 scikit-learn 0.24.0 或更高版本中,当您使用 GridSearchCV 或 RandomizedSearchCV 并设置 n_jobs=-1 时,设置任何详细数字(1、2、3 或 100)时,不会打印任何进度消息。但是,如果您使用 scikit-learn 0.23.2 或更低版本,一切都会按预期工作,并且 joblib 会打印进度消息。

下面是一个示例代码,您可以使用它在 Google Colab 或 Jupyter Notebook 中重复我的实验:

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV

iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[0.1, 1, 10]}
svc = svm.SVC()

clf = GridSearchCV(svc, parameters, scoring='accuracy', refit=True, n_jobs=-1, verbose=60)
clf.fit(iris.data, iris.target)
print('Best accuracy score: %.2f' %clf.best_score_)
Run Code Online (Sandbox Code Playgroud)

使用 scikit-learn 0.23.2 的结果:

Fitting 5 folds for each of 6 candidates, totalling 30 fits
[Parallel(n_jobs=-1)]: Using …
Run Code Online (Sandbox Code Playgroud)

scikit-learn joblib jupyter-notebook google-colaboratory gridsearchcv

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

带有 tfidf 和计数向量化器的 gridsearchcv

我想使用 GridSearchCV 进行参数调整。是否还可以使用 GridSearchCV 检查 CountVectorizer 还是 TfidfVectorizer 效果最好?我的想法:

pipeline = Pipeline([
           ('vect', TfidfVectorizer()),
           ('clf', SGDClassifier()),
])
parameters = {
'vect__max_df': (0.5, 0.75, 1.0),
'vect__max_features': (None, 5000, 10000, 50000),
'vect__ngram_range': ((1, 1), (1, 2), (1,3),  
'tfidf__use_idf': (True, False),
'tfidf__norm': ('l1', 'l2', None),
'clf__max_iter': (20,),
'clf__alpha': (0.00001, 0.000001),
'clf__penalty': ('l2', 'elasticnet'),
'clf__max_iter': (10, 50, 80),
}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, cv=5)
Run Code Online (Sandbox Code Playgroud)

我的想法:CountVectorizer 与 TfidfVectorizer 相同,其中 use_idf=False 且 normalize=None。如果 GridSearchCV 给出这些参数的最佳结果,那么 CountVectorizer 是最佳选择。那是对的吗?

先感谢您 :)

python machine-learning sentiment-analysis scikit-learn gridsearchcv

5
推荐指数
1
解决办法
5900
查看次数