В машинном обучении обобщение — это определение, демонстрирующее, насколько хорошо обученная модель может классифицировать или прогнозировать невидимые данные. Обучение обобщенной модели машинного обучения, как правило, означает, что она работает для всего подмножества невидимых данных. Например, когда мы обучаем модель классифицировать собак и кошек. Если модель снабжена набором данных изображений собак только с двумя породами, она может получить хорошую производительность. Но, возможно, он получит низкий классификационный балл при тестировании на других породах собак. Эта проблема может привести к тому, что фактическое изображение собаки будет классифицировано как кошка из невидимого набора данных. Поэтому разнообразие данных является очень важным фактором для того, чтобы сделать хороший прогноз. В приведенном выше примере модель может получить 85% баллов, если ее тестируют только две породы собак, и 70%, если ее тренируют все породы. Тем не менее, первый, возможно, получит очень низкий балл (например, 45%), если он оценивается невидимым набором данных для собак всех пород. Для последнего варианта это может быть неизменным преимуществом , учитывая, что он был обучен большим разнообразием данных, включая все возможные породы.
Следует принимать во внимание, что разнообразие данных - не единственный момент, который необходимо учитывать для получения обобщенной модели. Это может быть связано с характером алгоритма машинного обучения или плохой конфигурацией гиперпараметров.
Есть несколько методов (регуляризация), которые можно применять во время обучения модели, чтобы обеспечить обобщение.
========================================
Определяющие факторы для обучения обобщенных моделей.Существуют разные способы обеспечить обобщение модели машинного обучения.
1.Набор данных
Для обучения классификатора и создания обобщенной модели машинного обучения используемый набор данных должен содержать разнообразие. Следует отметить, что это не означает огромный набор данных, а набор данных, содержащий все разные выборки. Это помогает обучать классификатор не только на конкретном подмножестве данных и, следовательно, лучше выполнять обобщение. Кроме того, во время обучения рекомендуется использовать методы перекрестной проверки, такие как перекрестная проверка K-fold или Монте-Карло. Эти методы более безопасны для использования всех возможных частей данных и позволяют избежать создания модели переобучения.
2.Алгоритм машинного обучения
Алгоритмы машинного обучения по-разному действуют против переобучения, недообучения. Переобучение более вероятно с нелинейными, непараметрическими алгоритмами машинного обучения. Например, Decision Tree - это непараметрический алгоритм машинного обучения, то есть его модель с большей вероятностью переобучается. С другой стороны, некоторые модели машинного обучения слишком просты, чтобы фиксировать в данных сложные закономерности. Это приводит к построению неподходящей модели. Примерами являются линейная и логистическая регрессия.
3.Сложность модели
Когда модели машинного обучения становятся слишком сложными, они обычно склонны к переобучению. Существуют методы, помогающие упростить модель. Они называются методами регуляризации.
4.Регуляризация
Регуляризация — это набор методов, упрощающих модель машинного обучения. С этой целью к различным алгоритмам машинного обучения применяются определенные подходы, например, обрезка для деревьев решений, методы отсева для нейронных сетей и добавление параметров штрафа к функции стоимости в регрессии.
A classification example using Generalized Additive Models with pyGAM (https://www.kaggle.com/ )
Original csv files don't match register and names placed in python and require to be fixed up to be loaded via pandas into dataframes
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ cat generalClass.py
import pandas as pd
import matplotlib.pyplot as plt
from pygam import LogisticGAM, s, f
train_data = pd.read_csv('titanic_train.csv')
test_data = pd.read_csv('titanic_test.csv')
features = ["pclass", "sex", "sibsp", "parch"]
X_train = pd.get_dummies(train_data[features])
y_train = train_data["survived"]
final_X_test = pd.get_dummies(test_data[features])
classifier = LogisticGAM(s(0) + s(1) + s(2) + s(3))
classifier.fit(X_train, y_train)
predictions = classifier.predict(final_X_test)
# convert from True/False to 1/0
predictions = (predictions)*1
classifier.summary()
plt.figure(figsize=(15, 4))
for i, term in enumerate(classifier.terms):
if term.isintercept:
continue
plt.plot(classifier.partial_dependence(term=i), label="s({})".format(i))
plt.legend()
plt.draw()
output = pd.DataFrame({'passenger_id': test_data.passenger_id, 'survived': predictions})
output.to_csv('submission.csv', index=False)
plt.show()
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ python3 generalClass.py
LogisticGAM
===========================================
Distribution: BinomialDist Effective DoF: 11.4841
Link Function: LogitLink Log Likelihood: -390.4633
Number of Samples: 850 AIC: 803.8948 AICc: 804.2972
UBRE: 2.9566
Scale: 1.0
Pseudo R-Squared: 0.3019 =================================
Feature Function Lambda Rank EDoF P > x Sig. Code
=============================================
s(0) [0.6] 20 3.5 1.34e-10 ***
s(1) [0.6] 20 4.1 2.51e-02 *
s(2) [0.6] 20 3.2 4.98e-03 **
s(3) [0.6] 20 0.8 0.00e+00 ***
intercept 1 0.0 3.43e-02 *
============================================
Significance codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WARNING: Fitting splines and a linear function to a feature introduces a model identifiability problem
which can cause p-values to appear significant when they are not.
WARNING: p-values calculated in this manner behave correctly for un-penalized models or models with
known smoothing parameters, but when smoothing parameters have been estimated, the p-values
are typically lower than they should be, meaning that the tests reject the null too readily.
/home/boris/GENERALIZEDCLASS/generalClass.py:22: UserWarning: KNOWN BUG: p-values computed in this summary are likely much smaller than they should be.
Please do not make inferences based on these values!
Collaborate on a solution, and stay up to date at:
github.com/dswah/pyGAM/issues/163
classifier.summary()
Второй пример
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ cat testLogisticGAM1.py
from pygam import LogisticGAM, s, f
from pygam.datasets import default
import matplotlib.pyplot as plt
X, y = default(return_X_y=True)
gam = LogisticGAM(f(0) + s(1) + s(2)).gridsearch(X, y)
fig, axs = plt.subplots(1, 3)
titles = ['student', 'balance', 'income']
for i, ax in enumerate(axs):
XX = gam.generate_X_grid(term=i)
pdep, confi = gam.partial_dependence(term=i, width=.95)
ax.plot(XX[:, i], pdep)
ax.plot(XX[:, i], confi, c='r', ls='--')
ax.set_title(titles[i]);
plt.draw()
gam.accuracy(X, y)
gam.summary()
plt.show()
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ python3 testLogisticGAM1.py
100% (11 of 11) |######################################################| Elapsed Time: 0:00:02 Time: 0:00:02
LogisticGAM
============================================
Distribution: BinomialDist Effective DoF: 3.8047
Link Function: LogitLink Log Likelihood: -788.877
Number of Samples: 10000 AIC: 1585.3634
AICc: 1585.369
UBRE: 2.1588
Scale: 1.0
Pseudo R-Squared: 0.4598
=============================================
Feature Function Lambda Rank EDoF P > x Sig. Code
=============================================
f(0) [1000.] 2 1.7 4.61e-03 **
s(1) [1000.] 20 1.2 0.00e+00 ***
s(2) [1000.] 20 0.8 3.29e-02 *
intercept 1 0.0 0.00e+00 ***
=============================================
Significance codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WARNING: Fitting splines and a linear function to a feature introduces a model identifiability problem
which can cause p-values to appear significant when they are not.
WARNING: p-values calculated in this manner behave correctly for un-penalized models or models with
known smoothing parameters, but when smoothing parameters have been estimated, the p-values
are typically lower than they should be, meaning that the tests reject the null too readily.
/home/boris/GENERALIZEDCLASS/testLogisticGAM1.py:22: UserWarning: KNOWN BUG: p-values computed in this summary are likely much smaller than they should be.
Please do not make inferences based on these values!
Collaborate on a solution, and stay up to date at:
github.com/dswah/pyGAM/issues/163
gam.summary()
Третий пример
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ cat testLogisticGAM3.py
import pandas as pd
from pygam import LogisticGAM
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
from sklearn.metrics import log_loss
import numpy as np
from sklearn.model_selection import train_test_split
#load the breast cancer data set
data = load_breast_cancer()
#keep first 6 features only
df = pd.DataFrame(data.data, columns=data.feature_names)[['mean radius', 'mean texture', 'mean perimeter', 'mean area','mean smoothness', 'mean compactness']]
target_df = pd.Series(data.target)
print(df.describe())
X = df[['mean radius', 'mean texture', 'mean perimeter', 'mean area', \
'mean smoothness', 'mean compactness']]
y = target_df
lambda_ = [0.6, 0.6, 0.6, 0.6, 0.6, 0.6]
n_splines = [4, 14, 4, 6, 12, 12]
constraints = [None, None, None, None, None, None]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
gam = LogisticGAM(constraints=constraints,
lam=lambda_,
n_splines=n_splines).fit(X_train, y_train)
predictions = gam.predict(X_test)
print("Accuracy: {} ".format(accuracy_score(y_test, predictions)))
probas = gam.predict_proba(X_test)
print("Log Loss: {} ".format(log_loss(y_test, probas)))
gam.summary()
plt.rcParams['figure.figsize'] = (28, 8)
fig, axs = plt.subplots(1, len(data.feature_names[0:6]))
titles = data.feature_names
for i, ax in enumerate(axs):
XX = gam.generate_X_grid(term=i)
pdep, confi = gam.partial_dependence(term=i , width=.95)
ax.plot(XX[:, i], pdep)
ax.plot(XX[:, i], confi, c='grey', ls='--')
ax.set_title(titles[i])
plt.show()
(.env) boris@boris-All-Series:~/GENERALIZEDCLASS$ python3 testLogisticGAM3.py
mean radius mean texture ... mean smoothness mean compactness
count 569.000000 569.000000 ... 569.000000 569.000000
mean 14.127292 19.289649 ... 0.096360 0.104341
std 3.524049 4.301036 ... 0.014064 0.052813
min 6.981000 9.710000 ... 0.052630 0.019380
25% 11.700000 16.170000 ... 0.086370 0.064920
50% 13.370000 18.840000 ... 0.095870 0.092630
75% 15.780000 21.800000 ... 0.105300 0.130400
max 28.110000 39.280000 ... 0.163400 0.345400
[8 rows x 6 columns]
Accuracy: 0.9680851063829787
Log Loss: 0.10707673143908972
LogisticGAM
==========================================
Distribution: BinomialDist Effective DoF: 12.8118
Link Function: LogitLink Log Likelihood: -51.4609
Number of Samples: 381 AIC: 128.5454
AICc: 129.6627
UBRE: 2.3643
Scale: 1.0
Pseudo R-Squared: 0.7967
=========================================
Feature Function Lambda Rank EDoF P > x Sig. Code
=========================================
s(0) [0.6] 4 3.0 1.61e-06 ***
s(1) [0.6] 14 3.8 1.06e-03 **
s(2) [0.6] 4 1.3 4.19e-05 ***
s(3) [0.6] 6 0.7 0.00e+00 ***
s(4) [0.6] 12 2.6 1.06e-02 *
s(5) [0.6] 12 1.5 1.59e-01
intercept 1 0.0 7.66e-04 ***
=========================================
Significance codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
WARNING: Fitting splines and a linear function to a feature introduces a model identifiability problem
which can cause p-values to appear significant when they are not.
WARNING: p-values calculated in this manner behave correctly for un-penalized models or models with
known smoothing parameters, but when smoothing parameters have been estimated, the p-values
are typically lower than they should be, meaning that the tests reject the null too readily.
/home/boris/GENERALIZEDCLASS/testLogisticGAM3.py:36: UserWarning: KNOWN BUG: p-values computed in this summary are likely much smaller than they should be.
Please do not make inferences based on these values!
Collaborate on a solution, and stay up to date at:
github.com/dswah/pyGAM/issues/163
gam.summary()