NotFittedError
происходит, когда вы пытаетесь использовать метод .predict()
вашего классификатора до того, как вы обучились или использовали метод .fit()
.
Давайте возьмем, например, LinearRegression из scikit learn.
>>> import numpy as np
>>> from sklearn.linear_model import LinearRegression
>>> X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
>>> # y = 1 * x_0 + 2 * x_1 + 3
>>> y = np.dot(X, np.array([1, 2])) + 3
>>> reg = LinearRegression().fit(X, y)
>>> reg.score(X, y)
1.0
>>> reg.coef_
array([1., 2.])
>>> reg.intercept_
3.0000...
>>> reg.predict(np.array([[3, 5]]))
array([16.])
, поэтому с помощью строки reg = LinearRegression().fit(X, y)
вы создаете экземпляр класса LinearRegression
, а затем подгоняете егок вашим данным X и y, где X - независимые переменные, а y - ваши зависимые. После обучения модели внутри этого класса бета-коэффициенты для линейной регрессии сохраняются в атрибуте класса coef_
, и вы можете получить к нему доступ, используя reg.coef_
. Вот как класс знает, как предсказать, когда вы используете метод класса .predict()
. Класс обращается к этим коэффициентам, а затем к своей простой алгебре, чтобы получить прогноз.
Итак, вернемся к вашей ошибке. Если вы не подгоняете модель к своим данным обучения, тогда у класса нет необходимых атрибутов, необходимых для предсказаний. Надеюсь, это прояснит некоторую путаницу в отношении того, что происходит внутри класса, по крайней мере, в отношении того, как взаимодействуют методы fit()
и predict()
.
В конечном счете, как прокомментировано выше, это восходит к основам объектно-ориентированного программирования. поэтому, если вы хотите узнать больше, я бы прочитал о том, как Python обрабатывает классы, так как модели обучения scikit следуют тому же поведению