【问题标题】:sklearn.exceptions.NotFittedError: Estimator not fitted, call `fit` before exploiting the modelsklearn.exceptions.NotFittedError: Estimator not fit, 在利用模型之前调用`fit`
【发布时间】:2019-11-01 19:13:30
【问题描述】:

我尝试了随机森林回归。

代码如下。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import KFold, cross_val_predict
from sklearn.feature_selection import SelectKBest, f_regression 
from sklearn.pipeline import make_pipeline, Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import RFECV
from sklearn.model_selection import GridSearchCV
np.random.seed(0)


d1 = np.random.randint(2, size=(50, 10))
d2 = np.random.randint(3, size=(50, 10))
d3 = np.random.randint(4, size=(50, 10))
Y = np.random.randint(7, size=(50,))


X = np.column_stack([d1, d2, d3])


n_smples, n_feats = X.shape
print (n_smples, n_feats)


kf = KFold(n_splits=5, shuffle=True, random_state=0)

regr = RandomForestRegressor(max_features=None,random_state=0)                
pipe = make_pipeline(RFECV(estimator=regr, step=3, cv=kf, scoring = 
'neg_mean_squared_error', n_jobs=-1),
             GridSearchCV(regr, param_grid={'n_estimators': [100, 300]},
                          cv=kf, scoring = 'neg_mean_squared_error', 
n_jobs=-1))

ypredicts = cross_val_predict(pipe, X, Y, cv=kf, n_jobs=-1)

rmse = mean_squared_error(Y, ypredicts)
print (rmse)

但是,我收到以下错误: sklearn.exceptions.NotFittedError: Estimator not fit, 在利用模型之前调用fit

我也试过了:

model = pipe.fit(X,Y)

ypredicts = cross_val_predict(model, X, Y, cv=kf, n_jobs=-1)

但是遇到了同样的错误。

编辑 1: 我也试过了:

pipe.fit(X,Y)

但是遇到了同样的错误。

在 Python 2.7 (Sklearn 0.20) 中,对于相同的代码,我得到了不同的错误:

TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.

在 Python 2.7 (Sklearn 0.20.3) 中: NotFittedError: Estimator not fitted, callfitbefore exploiting the model.

【问题讨论】:

    标签: python machine-learning scikit-learn random-forest


    【解决方案1】:

    您似乎正在尝试通过使用网格搜索为您的分类器选择最佳参数,这是另一种方法。您正在使用管道,但在这种方法中我没有使用管道,但我通过随机搜索获得了最佳参数。

    import numpy as np
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import mean_squared_error
    from sklearn.model_selection import KFold, cross_val_predict
    from sklearn.feature_selection import SelectKBest, f_regression 
    from sklearn.pipeline import make_pipeline, Pipeline
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.feature_selection import RFECV
    from sklearn.model_selection import GridSearchCV
    from sklearn.model_selection import RandomizedSearchCV
    from sklearn.ensemble import RandomForestClassifier
    
    np.random.seed(0)
    
    
    d1 = np.random.randint(2, size=(50, 10))
    d2 = np.random.randint(3, size=(50, 10))
    d3 = np.random.randint(4, size=(50, 10))
    Y = np.random.randint(7, size=(50,))
    
    
    X = np.column_stack([d1, d2, d3])
    
    
    n_smples, n_feats = X.shape
    print (n_smples, n_feats)
    
    
    kf = KFold(n_splits=5, shuffle=True, random_state=0)
    
    regr = RandomForestRegressor(max_features=None,random_state=0)                
    
    n_iter_search = 20
    random_search = RandomizedSearchCV(regr, param_distributions={'n_estimators': [100, 300]},
                                       n_iter=20, cv=kf,verbose=1,return_train_score=True)
    random_search.fit(X, Y)
    
    ypredicts=random_search.predict(X)
    rmse = mean_squared_error(Y, ypredicts)
    print(rmse)
    print(random_search.best_params_)
    random_search.cv_results_
    

    试试这段代码。我希望这段代码能解决你的问题。

    【讨论】:

    • 谢谢。我知道它选择了最佳模型参数,但它是否也选择了最佳特征?
    • 希望你也能回答这个问题,stackoverflow.com/questions/56659584/…
    • 不!如果我们想选择最佳特征,我们将不得不应用一些其他数据挖掘技术来选择最佳特征。
    【解决方案2】:

    代替

    model = pipe.fit(X,Y)
    

    你试过了吗

    pipe.fit(X,Y)
    

    改为?

    原来如此

    pipe.fit(X,Y)
    # change model to pipe
    ypredicts = cross_val_predict(pipe, X, Y, cv=kf, n_jobs=-1)
    

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 2018-02-22
      • 2021-09-15
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2017-01-08
      • 2022-01-21
      • 2018-09-25
      相关资源
      最近更新 更多