我想在 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
问题:运行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 …
我经常用于GridSearchCV
超参数调整。例如,用于调整逻辑回归C
中的正则化参数。每当我使用的估计器有自己的参数时,我都会很困惑在哪里设置它,是在估计器中还是在 中,还是在两者中?同样的情况也适用于.n_jobs
GridSearchCV
cross_validate
当引用 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) 我有以下代码可以正常工作但得到了一个
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) 我尝试使用 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。“假”已通过
如您所见,我在使用 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) 考虑 3 个数据集训练/验证/测试。sklearnGridSearchCV()
默认情况下选择具有最高交叉验证分数的最佳模型。在预测需要准确的现实环境中,这是选择最佳模型的可怕方法。原因是它应该如何使用:
模型的训练集以学习数据集
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 分数更高。我发现这是一个常见问题,并且在互联网上没有找到任何解决方案。人们往往过于关注在学校学到的东西,而没有真正考虑选择过度拟合模型的后果。我看到了关于如何使用sklearn和caret包中的gridsearch并让他们为您选择模型的冗余帖子,但没有看到如何实际选择最佳模型。
到目前为止,我的方法非常手动。我想要一种自动化的方式来做到这一点。
我目前所做的是这样的:
gs = GridSearchCV(model, params, cv=3).fit(X_train, y_train) # X_train and y_train consists …
Run Code Online (Sandbox Code Playgroud) 在 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
我想使用 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
gridsearchcv ×10
scikit-learn ×10
python ×7
grid-search ×2
data-science ×1
joblib ×1
lightgbm ×1
memory-leaks ×1
r ×1
r-caret ×1