Wednesday, August 31, 2022

Generalized classification algorithm

 В машинном обучении обобщение — это определение, демонстрирующее, насколько хорошо обученная модель может классифицировать или прогнозировать невидимые данные. Обучение обобщенной модели машинного обучения, как правило, означает, что она работает для всего подмножества невидимых данных. Например, когда мы обучаем модель классифицировать собак и кошек. Если модель снабжена набором данных изображений собак только с двумя породами, она может получить хорошую производительность. Но, возможно, он получит низкий классификационный балл при тестировании на других породах собак. Эта проблема может привести к тому, что фактическое изображение собаки будет классифицировано как кошка из невидимого набора данных. Поэтому разнообразие данных является очень важным фактором для того, чтобы сделать хороший прогноз. В приведенном выше примере модель может получить 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()

 



No comments:

Post a Comment