На этом шаге мы рассмотрим более пдробно работу LogisticRegression.
Давайте более подробно разберем работу LogisticRegression на наборе данных Breast Cancer:
[In 28]: from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42) logreg = LogisticRegression().fit(X_train, y_train) print("Правильность на обучающем наборе: {:.3f}".format(logreg.score(X_train, y_train))) print("Правильность на тестовом наборе: {:.3f}".format(logreg.score(X_test, y_test))) Правильность на обучающем наборе: 0.953 Правильность на тестовом наборе: 0.958
Значение по умолчанию C=1 обеспечивает неплохое качество модели, правильность на обучающем и тестовом наборах составляет 95%. Однако поскольку качество модели на обучающем и тестовом наборах примерно одинако, вполне вероятно, что мы недообучили модель. Давайте попробуем увеличить C, чтобы подогнать более гибкую модель:
[In 29]: ogreg100 = LogisticRegression(C=100).fit(X_train, y_train) print("Правильность на обучающем наборе: {:.3f}".format(logreg100.score(X_train, y_train))) print("Правильность на тестовом наборе: {:.3f}".format(logreg100.score(X_test, y_test))) Правильность на обучающем наборе: 0.974 Правильность на тестовом наборе: 0.965
Использование C=100 привело к более высокой правильности на обучающей выборке, а также немного увеличилась правильность на тестовой выборке, что подтверждает наш довод о том, что более сложная модель должна сработать лучше.
Кроме того, мы можем выяснить, что произойдет, если мы воспользуемся более регуляризованной моделью (установив C=0.01 вместо значения по умолчанию C=1):
[In 30]: logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train) print("Правильность на обучающем наборе: {:.3f}".format(logreg001.score(X_train, y_train))) print("Правильность на тестовом наборе: {:.3f}".format(logreg001.score(X_test, y_test))) Правильность на обучающем наборе: 0.934 Правильность на тестовом наборе: 0.930
Как и следовало ожидать, когда мы получили недообученную модель и переместились влево по шкале, показанной на рисунке 1 27 шага, правильность как на обучающем, так и на тестовом наборах снизилась по сравнению с правильностью, которую мы получили, использовав параметры по умолчанию.
Рис.1. Рисунок 1 из 27 шага, иллюстрирующий компромисс между сложностью модели и правильностью на обучающей и тестовой выборках
И, наконец, давайте посмотрим на коэффициенты логистической регрессии, полученные с использованием трех различных значений параметра регуляризации C (рисунки 2 и 3):
[In 31]: plt.plot(logreg.coef_.T, 'o', label="C=1") plt.plot(logreg100.coef_.T, '^', label="C=100") plt.plot(logreg001.coef_.T, 'v', label="C=0.001") plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90) plt.hlines(0, 0, cancer.data.shape[1]) plt.ylim(-5, 5) plt.xlabel("Индекс коэффициента") plt.ylabel("Индекс коэффициента") plt.legend()
Рис.2. Коэффициенты, полученные с помощью логистической регрессии с разными значениями C для набора данных Breast Cancer
Рис.3. Только график
Если мы хотим получить более интерпретабельную модель, нам может помочь L1 регуляризация, поскольку она ограничивает модель использованием лишь нескольких признаков. Ниже приводится график с коэффициентами и оценками правильности для L1 регуляризации (рисунок 3):
[In 34]: for C, marker in zip([0.001, 1, 100], ['o', '^', 'v']): lr_l1 = LogisticRegression(C=C, penalty="l1").fit(X_train, y_train) print("Правильность на обучении для логрегрессии l1 с C={:.3f}: {:.2f}". format(C, lr_l1.score(X_train, y_train))) print("Правильность на тесте для логрегрессии l1 с C={:.3f}: {:.2f}". format(C, lr_l1.score(X_test, y_test))) plt.plot(lr_l1.coef_.T, marker, label="C={:.3f}".format(C)) plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90) plt.hlines(0, 0, cancer.data.shape[1]) plt.xlabel("Индекс коэффициента") plt.ylabel("Оценка коэффициента") plt.ylim(-5, 5) plt.legend(loc=3) Правильность на обучении для логрегрессии l1 с C=0.001: 0.91 Правильность на тесте для логрегрессии l1 с C=0.001: 0.92 Правильность на обучении для логрегрессии l1 с C=1.000: 0.96 Правильность на тесте для логрегрессии l1 с C=1.000: 0.96 Правильность на обучении для логрегрессии l1 с C=100.000: 0.99 Правильность на тесте для логрегрессии l1 с C=100.000: 0.98
Рис.4. Коэффициенты логистической регрессии с L1 штрафом для набора данных Breast Cancer (использовались различные значения C)
Рис.5. Только график
Видно, что существует много параллелей между линейными моделями для бинарной классификации и линейными моделями для регрессии. Как и в регрессии, основное различие между моделями – в параметре penalty, который влияет на регуляризацию и определяет, будет ли модель использовать все доступные признаки или выберет лишь подмножество признаков.
На следующем шаге мы рассмотрим линейные модели для мультиклассовой классификации.