Thursday, July 28, 2022

How to copy file in python with progress bar

Можно использовать внешнюю библиотеку Python tqdm для создания простых и удобных индикаторов выполнения, которые вы можете добавить в свой код и сделать его живым.Использовать tqdm очень просто, вам просто нужно добавить свой код между tqdm() после импорта библиотеки в ваш код. Вы должны убедиться, что код, который вы вставляете между функцией tqdm(), должен быть итерируемым, иначе он вообще не будет работать.

Iterable — это объект, который можно перебирать или повторять с помощью цикла for. Такие объекты, как списки, кортежи, наборы, словари, строки и т. д., называются итерируемыми. Короче говоря, iterable — это все, что вы можете перебрать в цикле.

(.env) boris@boris-All-Series:~/PROGRESSB$ cat progressBar.py

import os

from io import BytesIO

from tqdm import tqdm

file = '../Downloads/ubuntu-22.04-desktop-amd64.iso'

fsize = int(os.path.getsize(file))

new = './ubuntu-22.04-desktop-amd64.iso'

with open(file, 'rb') as f:

 with open(new, 'ab') as outData:

   with tqdm(ncols=60,total=fsize,bar_format='{l_bar}{bar}|Remaining:{remaining}') as pbar: 

         buffer = bytearray()

         while True:

            buf = f.read(16384)

            outData.write(buf)

            if len(buf) == 0:

                     break

            buffer += buf

            pbar.update(len(buf))

(.env) boris@boris-All-Series:~/PROGRESSB$ ll

total 16

drwxrwxr-x   3 boris boris 4096 июл 28 11:07 ./

drwxr-xr-x 132 boris boris 4096 июл 28 10:49 ../

drwxrwxr-x   6 boris boris 4096 июл 28 10:31 .env/

-rw-rw-r--   1 boris boris  570 июл 28 11:04 progressBar.py

(.env) boris@boris-All-Series:~/PROGRESSB$ cat progressBar.py

import os

from io import BytesIO

from tqdm import tqdm

file = '../Downloads/ubuntu-22.04-desktop-amd64.iso'

fsize = int(os.path.getsize(file))

new = './ubuntu-22.04-desktop-amd64.iso'

with open(file, 'rb') as f:

 with open(new, 'ab') as outData:

   with tqdm(ncols=60,total=fsize,bar_format='{l_bar}{bar}|Remaining:{remaining}') as pbar: 

         buffer = bytearray()

         while True:

            buf = f.read(16384)

            outData.write(buf)

            if len(buf) == 0:

                     break

            buffer += buf

            pbar.update(len(buf))

(.env) boris@boris-All-Series:~/PROGRESSB$ python3 progressBar.py

100%|███████████████████████████████████████|Remaining:00:00

(.env) boris@boris-All-Series:~/PROGRESSB$ ll

total 3569316

drwxrwxr-x   3 boris boris       4096 июл 28 11:07 ./

drwxr-xr-x 132 boris boris       4096 июл 28 10:49 ../

drwxrwxr-x   6 boris boris       4096 июл 28 10:31 .env/

-rw-rw-r--   1 boris boris        570 июл 28 11:04 progressBar.py

-rw-rw-r--   1 boris boris 3654957056 июл 28 11:07 ubuntu-22.04-desktop-amd64.iso






























































Wednesday, July 27, 2022

Generate PDF Report from MySQL (table) via Flask Framework

Это пример того, как создать отчет в формате PDF из базы данных MySQL с помощью Python Flask. Будет создано веб-приложение, используя легкий веб-фреймворк Пайтон Flask. Мы будем генерировать PDF-файл на лету из базы данных MySQL в этом веб-приложении. Ссылка для скачивания будет предоставлена во внешнем интерфейсе или пользовательском интерфейсе, по которой конечные пользователи щелкнут и получат возможность сохранить сгенерированный файл PDF в соответствии с выбранным местом.

Мы собираемся использовать API fpdf для создания отчета в формате PDF. Поскольку мы не сохраняем этот PDF-отчет где-либо в физическом расположении сервера, мы отправим данные в объекте Response в виде вложения.

Отчеты в основном создаются в формате PDF, поскольку файл PDF является документом «только для чтения», который нельзя изменить, не оставив электронного следа, в то время как другие форматы, такие как изображение,слово,Excel и т.д.,можно легко изменить,

не оставив электронного следа.

Ниже Я старался как можно более детально описать файловую конфигурацию для правильной работы  Flask и Пайтон код app.py, db.py, main.py и положение download.html

Installation - Use pip to install flask-mysql : pip install flask-mysql ( in venv )

(.env) boris@boris-All-Series:~/flaskproject$ ls -CRl

.:

total 24

-rw-rw-r-- 1 boris boris   46 июл 27 14:01 app.py

-rw-rw-r-- 1 boris boris  304 июл 27 14:00 db.py

drwxrwxr-x 3 boris boris 4096 июл 27 13:43 download

-rw-rw-r-- 1 boris boris 1462 июл 27 14:09 main.py

drwxrwxr-x 2 boris boris 4096 июл 27 14:05 __pycache__

drwxrwxr-x 2 boris boris 4096 июл 27 13:55 templates

./download:

total 4

drwxrwxr-x 2 boris boris 4096 июл 27 14:10 report

./download/report:

total 4

-rw-rw-r-- 1 boris boris 1980 июл 27 14:10 employee_report.pdf

./__pycache__:

total 8

-rw-rw-r-- 1 boris boris 182 июл 27 14:02 app.cpython-38.pyc

-rw-rw-r-- 1 boris boris 409 июл 27 14:05 db.cpython-38.pyc

./templates:

total 4

-rw-rw-r-- 1 boris boris 199 июл 27 13:46 download.html

=====================================

(.env) boris@boris-All-Series:~/flaskproject/templates$ cat download.html

<!doctype html>

<title>Python Flask File Generate PDF Report from MySQL</title>

<h2>Generate PDF Report from MySQL</h2>

<p>

<a href="{{ url_for('.download_report') }}">Generate Pdf Report</a>

</p>

==============================
(.env) boris@boris-All-Series:~/flaskproject$ cat app.py

from flask import Flask

app = Flask(__name__)

=====================================

(.env) boris@boris-All-Series:~/flaskproject$ cat db.py

from app import app

from flaskext.mysql import MySQL

mysql = MySQL()

# MySQL configurations

app.config['MYSQL_DATABASE_USER'] = 'root'

app.config['MYSQL_DATABASE_PASSWORD'] = '*********'

app.config['MYSQL_DATABASE_DB'] = 'roytuts'

app.config['MYSQL_DATABASE_HOST'] = 'localhost'

mysql.init_app(app)

=================================

(.env) boris@boris-All-Series:~/flaskproject$ cat main.py

import pymysql

from app import app

from db import mysql

from flask import Flask, Response, render_template

from fpdf import FPDF


@app.route('/')

def upload_form():

return render_template('download.html')


@app.route('/download/report/pdf')

def download_report():

conn = None

cursor = None

try:

conn = mysql.connect()

cursor = conn.cursor(pymysql.cursors.DictCursor)

cursor.execute("SELECT emp_id, emp_first_name,  \

                    emp_last_name, emp_designation FROM employee")

result = cursor.fetchall()

pdf = FPDF()

pdf.add_page()

page_width = pdf.w - 2 * pdf.l_margin

pdf.set_font('Times','B',14.0) 

pdf.cell(page_width, 0.0, 'Employee Data', align='C')

pdf.ln(10)

pdf.set_font('Courier', '', 12)

col_width = page_width/4

pdf.ln(1)

        th = pdf.font_size

         for row in result:

pdf.cell(col_width, th, str(row['emp_id']), border=1)

pdf.cell(col_width, th, row['emp_first_name'], border=1)

pdf.cell(col_width, th, row['emp_last_name'], border=1)

pdf.cell(col_width, th, row['emp_designation'], border=1)

pdf.ln(th)

pdf.ln(10)

pdf.set_font('Times','',10.0) 

pdf.cell(page_width, 0.0, '- end of report -', align='C')

return Response(pdf.output(dest='S').encode('latin-1'), \

                        mimetype='application/pdf', \

                        headers={'Content-Disposition':'attachment;  \

                        filename=employee_report.pdf'})

except Exception as e:

print(e)

finally:

cursor.close() 

conn.close()

if __name__ == "__main__":

    app.run()

























Статус таблицы в MySQL Database
































Monday, July 25, 2022

AdaBoost algorithm and learn AdaBoost model building in Python

 Ada-boost или Adaptive Boosting — это один из классификаторов повышения ансамбля, предложенный в 1996 году. Он объединяет несколько классификаторов для повышения точности классификаторов. AdaBoost — это итеративный ансамблевый метод. Классификатор AdaBoost создает сильный классификатор, объединяя несколько плохо работающих классификаторов, так что вы получите сильный классификатор с высокой точностью. Основная концепция Adaboost заключается в установке весов классификаторов и обучении выборки данных на каждой итерации, чтобы обеспечить точные прогнозы необычных наблюдений. Любой алгоритм машинного обучения может использоваться в качестве базового классификатора, если он принимает веса в обучающем наборе. Adaboost должен соответствовать двум условиям:

Классификатор должен обучаться в интерактивном режиме на различных взвешенных обучающих примерах.

На каждой итерации он пытается обеспечить идеальное соответствие этим примерам, сводя к минимуму ошибку обучения.

============================================

Как работает алгоритм AdaBoost?

Первоначально Adaboost случайным образом выбирает обучающую подгруппу.

Он итеративно обучает модель машинного обучения AdaBoost, выбирая обучающий набор на основе точного прогноза последнего обучения.

Он присваивает более высокий вес неправильно классифицированным наблюдениям, чтобы в следующей итерации эти наблюдения получили высокую вероятность классификации.

Кроме того, он присваивает вес обученному классификатору на каждой итерации в соответствии с точностью классификатора. Более точный классификатор получит больший вес.

Этот процесс повторяется до тех пор, пока полные обучающие данные не будут соответствовать без какой-либо ошибки или пока не будет достигнуто указанное максимальное количество оценок.

Чтобы классифицировать, проведите «голосование» по всем созданным вами алгоритмам обучения.












(.env) boris@boris-All-Series:~/ADABOOST$ cat  AdaBoost1.py

from sklearn.ensemble import AdaBoostClassifier

from sklearn import datasets

from sklearn.model_selection import train_test_split

from sklearn import metrics


# Load data

iris = datasets.load_iris()

X = iris.data

y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

abc = AdaBoostClassifier(n_estimators=50, learning_rate=1)


# Train Adaboost Classifer

model = abc.fit(X_train, y_train)

#Predict the response for test dataset

y_pred = model.predict(X_test)

print("Accuracy:",metrics.accuracy_score(y_test, y_pred)) 


# Import Support Vector Classifier

from sklearn.svm import SVC

from sklearn import metrics

svc=SVC(probability=True, kernel='linear')

abc =AdaBoostClassifier(n_estimators=50, base_estimator=svc,learning_rate=1)

model = abc.fit(X_train, y_train)


#Predict the response for test dataset

y_pred = model.predict(X_test)

# Model Accuracy, how often is the classifier correct?

print("Accuracy with base_est = SVC:",metrics.accuracy_score(y_test, y_pred))


(.env) boris@boris-All-Series:~/ADABOOST$ python3 AdaBoost1.py

Accuracy: 0.9333333333333333

Accuracy with base_est = SVC: 0.9555555555555556

(.env) boris@boris-All-Series:~/ADABOOST$ python3 AdaBoost1.py

Accuracy: 0.9333333333333333

Accuracy with base_est = SVC: 0.9555555555555556

(.env) boris@boris-All-Series:~/ADABOOST$ python3 AdaBoost1.py

Accuracy: 0.9111111111111111

Accuracy with base_est = SVC: 0.9777777777777777



























Sunday, July 24, 2022

Activation Functions In Artificial Neural Networks

Функции активации в искусственных нейронных сетях

Искусственные нейронные сети (ИНС). Эта идея моделируется в искусственных нейронных сетях, где мы представляем нашу модель в виде нейронов, соединенных ребрами (аналогично аксонам). Значение нейрона это просто сумма значений предыдущих нейронов, связанных с ним, взвешенных по весам их ребер. Наконец, нейрон проходит через функцию, чтобы решить, насколько сильно он должен быть активирован, которая называется функцией активации.

RELU в регрессии. Функция активации (ReLU)

Мы применяем функции активации к скрытым и выходным нейронам, чтобы нейроны не опускались слишком низко или слишком высоко, что будет работать против процесса обучения сети. Просто так математика работает лучше.Наиболее важная функция активации применяется к выходному слою. Если NN применяется к проблеме регрессии, то вывод должен быть непрерывным. Для демонстрации мы используем набор данных о ценах на жилье в одном из мегаполисов. Цена дома не может быть отрицательной. Мы навязываем это правило, используя одну из самых интуитивно понятных и полезных функций активации: Rectified Linear Unit. Единственное, что он делает, это; если значение отрицательное, установите его равным нулю.













 Как построить модель нейронной сети с бинарной классификацией (1).

(.env) boris@boris-All-Series:~/NeuralNet$ cat BinaryClassif.py

from collections import Counter

import numpy as np

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import tensorflow as tf

from sklearn.datasets import load_boston

from sklearn.model_selection import train_test_split

from tensorflow.keras.layers import Dense, Dropout, Input

from tensorflow.keras.models import Model


tf.random.set_seed(42)

np.random.seed(42)


from sklearn.metrics import classification_report

from sklearn.datasets import load_breast_cancer

from sklearn.utils.class_weight import compute_class_weight


data = load_breast_cancer()

X = data["data"]

y = data["target"]

labels = data["target_names"]

X_train, X_test, y_train, y_test= train_test_split(X, y, random_state=42)


"""

def annotate_bars(ax, patches, horizontal=False, as_int=True):

    for p in patches:

        if horizontal:

            w = p.get_width()

            w = int(w) if as_int else round(w, 3)

            if w == 0:

                continue

            ax.annotate(f"{w}", (p.get_width()* 1.01, p.get_y() +0.1), fontsize=14)

        else:

            h = p.get_height()

            h = int(h) if as_int else round(h, 3)

            if h == 0:

                continue

            ax.annotate(f"{h}", (p.get_x() +p.get_width()/2, p.get_height()* 1.01), fontsize=14)

    return ax

counter = Counter(y)

keys = counter.keys()

values = counter.values()

fig = plt.figure(figsize=(16, 9))

bar = plt.bar(keys, values)

annotate_bars(plt, bar.patches)

plt.xticks([0, 1], labels=["malignant", "benign"])

plt.xlabel("Class", fontsize=16)

plt.ylabel("Frequency", fontsize=16)

plt.title("Labels Distribution", fontsize=22)

plt.show()

"""

classes = [0, 1]

class_weight = compute_class_weight('balanced',classes=classes, y=y_train)

class_weight

class_weight_dict = dict(zip([0, 1], class_weight))

class_weight_dict

input_shape = X.shape[1] # number of features, which is 30

output_shape = 1

inputs = Input(shape=(input_shape,))

h = Dense(32, activation="relu")(inputs)

h = Dense(16, activation="relu")(h)

h = Dense(8, activation="relu")(h)

h = Dense(4, activation="relu")(h)

out = Dense(output_shape, activation="sigmoid")(h)

model = Model(inputs=inputs, outputs=[out])

model.summary()

model.compile(optimizer="adam", loss="binary_crossentropy", metrics="accuracy")

H = model.fit(

    x=X_train,

    y=y_train,

    validation_data=(

        X_test, y_test

    ),

    class_weight=class_weight_dict,

    epochs=50,

)


f, axarr = plt.subplots(1,2, figsize=(16, 9))

axarr[0].plot(H.history["loss"], label="loss")

axarr[0].plot(H.history["val_loss"], label="validation loss")

axarr[0].legend()


axarr[1].plot(H.history["accuracy"], label="accuracy")

axarr[1].plot(H.history["val_accuracy"], label="validation accuracy")

axarr[1].legend()

axarr[1].set_yticks(np.arange(0.4, 1, 0.05))

plt.draw()


pred_probs = model.predict(X_test) # predicted probabilities

y_pred=  pred_probs>=0.5 # higher than 50% probability means a positive class (i.e. class 1 or malignant)

print(classification_report(y_test, y_pred))

plt.show()
































(.env) boris@boris-All-Series:~/NeuralNet$ cat ActivationFunc.py (2)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Dense, Dropout, Input
from tensorflow.keras.models import Model
import seaborn as sns

tf.random.set_seed(42)
np.random.seed(42)

data = load_boston()
X = data["data"]
y = data["target"]
df = pd.DataFrame(X, columns=data["feature_names"])
df["PRICE"] = y
print(df)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
input_shape = X.shape[1] # number of features, which is 13
# this is regression
# so we only need one neuron to represent the prediction
output_shape = 1

# we set up our input layer
inputs = Input(shape=(input_shape,))
# we add 3 hidden layers with diminishing size. This is a common practice in designing a neural network
# as the features get more and more abstracted, we need less and less neurons.
h = Dense(16, activation="relu")(inputs)
h = Dense(8, activation="relu")(h)
h = Dense(4, activation="relu")(h)
# and finally we use the ReLU activation function on the output layer
out = Dense(output_shape, activation="relu")(h)
model = Model(inputs=inputs, outputs=[out])
model.summary()

model.compile(optimizer="adam", loss="mean_squared_error")
H = model.fit(
    x=X_train,
    y=y_train,
    validation_data=(
        X_test, y_test
    ),
    epochs=100,
)

fig = plt.figure(figsize=(16, 9))
plt.plot(H.history["loss"], label="loss")
plt.plot(H.history["val_loss"], label="validation loss")
plt.draw()

sns.displot(x=y, kde=True, aspect=16/9)

# Add labels
plt.title(f'Histogram of house prices\nMean: {round(np.mean(y), 2)}\nStandard Deviation: {round(np.std(y), 2)}', fontsize=22)
plt.xlabel('House Price Range', fontsize=16)
plt.ylabel('Frequency', fontsize=16)
plt.xticks(np.arange(0, 50, 2))
plt.draw()


y_pred = model.predict(X_test)
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred))}")
print(f"MAE: {mean_absolute_error(y_test, y_pred)}")
print(f"R2: {r2_score(y_test, y_pred)}")

plt.show()
































Wednesday, July 20, 2022

Any Boolean function can be represented as a neural network

 Все начинается с MP Neuron, который представляет собой очень упрощенную модель нейрона. С очень простой идеей суммирования всех входных данных, превышающих порог для данной функции, нейрон срабатывает, иначе он не срабатывает. Очень примитивное начало на деле. Для проверки его репрезентативности рассмотрим геометрическую интерпретацию. Сначала двухмерный анализ с двумя входными данными для аппроксимации функции ИЛИ, а затем переход к трехмерному анализу с тремя входными данными.

















Следовательно, McCulloch Pitts Neuron можно использовать для представления любой булевой функции, которая является линейно отделимой. Кроме того, мы можем видеть строгое правило демаркации вместо постепенной границы принятия решений, где все, что немного выше разделяющей границы, равно 1, а чуть ниже - 0. Нейроны запускаются со ступенчатой функцией, подобной поведению. Большая гибкость достигается за счет того, что персептроны имеют веса, прикрепленные к каждому из его входов, но все еще существует строгое разграничение. 

Но вышеупомянутые механизмы не работают для нелинейно разделимых функций. Очень простым примером является XOR, представьте, что для этой функции рисуется разделительная линия в двумерной плоскости. Не будет ни одного! Как и в XOR, большинство данных линейно неразделимы по своей природе.

=====================================

Следовательно, для создания разделительных границ для этих функций требуются передовые вычислительные модели, такие как современные нейронные сети. Просто посмотрите базовую иллюстрацию с одним скрытым слоем и некоторыми предопределенными весами, которые воспроизводят функцию XOR.












h1(0,0) => w1 = 0, h2(1,0) =>w2 = 1, h3(0,1) =>w3 = 1, h4(1,1) => w4 = 0 ;  x 1, x2 выбираются из {0,1} - всего 4 комбинации на входе и значение w= x1(⊕)x2 на выходе.

Любая булева функция n входов может быть представлена сетью персептронов, содержащей 1 скрытый слой с 2^n персептронами и один выходной слой, содержащий 1 персептрон. Это достаточное условие, но не необходимое.

В нашем анализе сетей с одним скрытым слоем со ступенчатой ​​функцией, подобной аппроксимации. У него есть ограничения с его жесткими критериями оценки, эквивалентными ступенчатой ​​функции.

Диграммы для x1 ^ x2, x1 v x2, x1 -> x2 = (!x1) v (x2) нетрудно построить так же как и для XOR

Для х1 ^ x2 :

h1(0,0) => w1 = 0, h2(1,0) =>w2 = 0, h3(0,1) =>w3 = 0, h4(1,1) => w4 = 1 ;  x 1, x2 выбираются из {0,1} - всего 4 комбинации на входе и значение w= (x1 ^ x2) на выходе.

Для х1 v x2 :

h1(0,0) => w1 = 0, h2(1,0) =>w2 = 1, h3(0,1) =>w3 = 1, h4(1,1) => w4 = 1 ;  x 1, x2 выбираются из {0,1} - всего 4 комбинации на входе и значение w= (x1 v x2) на выходе.

Post-Pruning in Decision Tree

 Сокращение дерева решений помогает предотвратить переобучение модели, чтобы наша модель хорошо обобщала невидимые данные. Сокращение дерева решений означает удаление избыточного и бесполезного разделения поддерева и замену его конечным узлом.

Post Pruning :

Этот метод используется после построения дерева решений.

Этот метод используется, когда дерево решений будет иметь очень большую глубину и будет показывать переоснащение модели.

Это также известно как обратная обрезка.

Этот метод используется, когда у нас есть бесконечно растущее дерево решений.

Здесь мы будем контролировать ветви дерева решений max_depth и min_samples_split, используя cost_complexity_prunin

(.env) boris@boris-All-Series:~/PostPruning$ cat  PostPruning3.py

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn import tree

from sklearn.metrics import accuracy_score

from sklearn.datasets import load_breast_cancer

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier


X,y=load_breast_cancer(return_X_y=True)

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)

clf=DecisionTreeClassifier(random_state=0)

clf.fit(X_train,y_train)

y_train_predicted=clf.predict(X_train)

y_test_predicted=clf.predict(X_test)

accuracy_score(y_train,y_train_predicted)

accuracy_score(y_test,y_test_predicted)

# мы видим, что разница между оценкой точности тренинга и теста слишком высока, 

# что означает, что модель переобучена (поскольку она точна для обучающего набора, 

# но дает большую ошибку, когда мы предоставляем тестовый набор модели)

plt.figure(figsize=(16,8))

tree.plot_tree(clf)

plt.show()

# ccp_alphas дает минимальное значение листа дерева решений, 

# и каждый ccp_aphas создаст разные классификаторы и выберет лучший из них. 

# ccp_alphas будет добавлен в качестве параметра в DecisionTreeClassifier()

path=clf.cost_complexity_pruning_path(X_train,y_train)

#path variable gives two things ccp_alphas and impurities

ccp_alphas,impurities=path.ccp_alphas,path.impurities

print("ccp alpha wil give list of values :",ccp_alphas)

print("***********************************************************")

print("Impurities in Decision Tree :",impurities)

clfs=[]   #will store all the models here

for ccp_alpha in ccp_alphas:

               clf=DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)

              clf.fit(X_train,y_train)

              clfs.append(clf)

print("Last node in Decision tree is {} and ccp_alpha for last node is {}".format(clfs[-1].tree_.node_count,ccp_alphas[-1]))


train_scores = [clf.score(X_train, y_train) for clf in clfs]

test_scores = [clf.score(X_test, y_test) for clf in clfs]

fig, ax = plt.subplots()

ax.set_xlabel("alpha")

ax.set_ylabel("accuracy")

ax.set_title("Accuracy vs alpha for training and testing sets")

ax.plot(ccp_alphas, train_scores, marker='o', label="train",drawstyle="steps-post")

ax.plot(ccp_alphas, test_scores, marker='o', label="test",drawstyle="steps-post")

ax.legend()

plt.draw()

clf=DecisionTreeClassifier(random_state=0,ccp_alpha=0.02)

clf.fit(X_train,y_train)

plt.figure(figsize=(12,8))

tree.plot_tree(clf,rounded=True,filled=True)

plt.show()























































































Tuesday, July 19, 2022

Plot multinomial and One-vs-Rest Logistic Regression

Полиномиальная логистическая регрессия.Логистическая регрессия - это алгоритм классификации.

Он предназначен для наборов данных, которые имеют числовые входные переменные и категориальную целевую переменную, имеющую два значения или класса. Задачи этого типа называются задачами бинарной классификации. Логистическая регрессия предназначена для задач двух классов, моделирующих цель с использованием биномиальной функции распределения вероятностей. Метки класса сопоставляются с 1 для положительного класса или результата и 0 для отрицательного класса или результата. Подходящая модель предсказывает вероятность того, что пример принадлежит классу 1. По умолчанию логистическая регрессия не может использоваться для задач классификации, которые имеют более двух меток классов, так называемая мультиклассовая классификация. Вместо этого требуется модификация для поддержки задач классификации нескольких классов.

Один из популярных подходов к адаптации логистической регрессии к задачам классификации с несколькими классами состоит в том, чтобы разделить проблему классификации с несколькими классами на несколько задач бинарной классификации и подобрать стандартную модель логистической регрессии для каждой подзадачи. Методы этого типа включают модели оболочки «один против остальных» и «один против одного». Альтернативный подход включает изменение модели логистической регрессии для прямой поддержки предсказания нескольких меток классов. В частности, чтобы предсказать вероятность того, что входной пример принадлежит каждой известной метке класса. Распределение вероятностей, которое определяет многоклассовые вероятности, называется полиномиальным распределением вероятностей. Модель логистической регрессии, адаптированная для изучения и прогнозирования полиномиального распределения вероятностей, называется полиномиальной логистической регрессией. Точно так же мы можем называть стандартную или стандартную логистическую регрессию биномиальной логистической регрессией. Биномиальная логистическая регрессия: стандартная логистическая регрессия, предсказывающая биномиальную вероятность (т. е. для двух классов) для каждого входного примера. Полиномиальная логистическая регрессия: модифицированная версия логистической регрессии, которая предсказывает полиномиальную вероятность (т. е. более двух классов) для каждого входного примера.

Дискретные распределения вероятностей для машинного обучения

Изменение логистической регрессии с биномиальной на полиномиальную вероятность требует изменения функции потерь, используемой для обучения модели (например, логарифмическая потеря на кросс-энтропийную потерю), и изменения выходных данных с одного значения вероятности на одну вероятность для каждой метки класса.

(.env) boris@boris-All-Series:~/MultinomlogisticRegression$ cat plotLogistRegMultinom.py

"""

Plot multinomial and One-vs-Rest Logistic Regression

Постройте поверхность решений полиномиальной и логистической регрессии «один против остальных». Гиперплоскости, соответствующие трем классификаторам «один против остальных» (OVR), представлены пунктирными линиями.

"""

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import make_blobs

from sklearn.linear_model import LogisticRegression

from sklearn.inspection import DecisionBoundaryDisplay

# make 3-class dataset for classification

centers = [[-5, 0], [0, 1.5], [5, -1]]

X, y = make_blobs(n_samples=1000, centers=centers, random_state=40)

transformation = [[0.4, 0.2], [-0.4, 1.2]]

X = np.dot(X, transformation)

for multi_class in ("multinomial", "ovr"):

    clf = LogisticRegression(

        solver="sag", max_iter=100, random_state=42, multi_class=multi_class

    ).fit(X, y)

    # print the training scores

    print("training score : %.3f (%s)" % (clf.score(X, y), multi_class))

    _, ax = plt.subplots()

    DecisionBoundaryDisplay.from_estimator(

        clf, X, response_method="predict", cmap=plt.cm.Paired, ax=ax

    )

    plt.title("Decision surface of LogisticRegression (%s)" % multi_class)

    plt.axis("tight")

    # Plot also the training points

    colors = "bry"

    for i, color in zip(clf.classes_, colors):

        idx = np.where(y == i)

        plt.scatter(

            X[idx, 0], X[idx, 1], c=color, cmap=plt.cm.Paired, edgecolor="black", s=20

        )

    # Plot the three one-against-all classifiers

    xmin, xmax = plt.xlim()

    ymin, ymax = plt.ylim()

    coef = clf.coef_

    intercept = clf.intercept_

    def plot_hyperplane(c, color):

        def line(x0):

            return (-(x0 * coef[c, 0]) - intercept[c]) / coef[c, 1]

        plt.plot([xmin, xmax], [line(xmin), line(xmax)], ls="--", color=color)

    for i, color in zip(clf.classes_, colors):

        plot_hyperplane(i, color)

plt.show()































AdaBoost Algorithm From Scratch

 Boosting — это метод моделирования ансамбля, который пытается построить сильный классификатор из числа слабых классификаторов. Это делается путем построения модели с использованием последовательно слабых моделей. Во-первых, модель строится из обучающих данных. Затем строится вторая модель, которая пытается исправить ошибки, присутствующие в первой модели. Эта процедура продолжается, и модели добавляются до тех пор, пока не будет правильно предсказан полный набор обучающих данных или пока не будет добавлено максимальное количество моделей.

AdaBoost был первым действительно успешным алгоритмом повышения, разработанным для двоичной классификации. Модели AdaBoost относятся к классу ансамблевых моделей машинного обучения. Из буквального значения слова «ансамбль» мы можем легко лучше понять, как работает эта модель. Модели ансамбля берут на себя ответственность за объединение различных моделей, а затем создают усовершенствованную / более точную метамодель. Эта метамодель имеет сравнительно высокую точность прогнозирования по сравнению с соответствующими аналогами. Алгоритм AdaBoost подпадает под методы повышения ансамбля, поскольку он объединяет несколько моделей для получения более точных результатов, и это делается в два этапа: Несколько слабых учеников могут учиться на обучающих данных.Комбинируя эти модели для создания метамодели, эта метамодель направлена ​​на устранение ошибок, совершаемых отдельными слабыми учениками.AdaBoost — это сокращение от Adaptive Boosting, это очень популярный метод повышения, который объединяет несколько «слабых классификаторов» в один «сильный классификатор». 

Окончательная или комбинированная гипотеза H вычисляет знак взвешенной комбинации слабых гипотез.

          T

F(x)=∑α(t)*ht(x)

         t=1 

Это эквивалентно утверждению, что H вычисляется как взвешенное большинство голосов слабых гипотез ht, где каждой присваивается вес α(t). Так что да, итоговая возвращенная модель — это взвешенное голосование всех слабых учеников, обученных этой итерации. 

Хотя повышение не ограничено алгоритмически, большинство алгоритмов повышения состоят из итеративного изучения слабых классификаторов по отношению к распределению и добавления их к окончательному сильному классификатору. Когда они добавляются, они обычно взвешиваются, что обычно связано с точностью слабых учеников.Также обратите внимание на упоминание о том, что в исходных алгоритмах повышения использовалось «большинство». Понятие голосования довольно прочно встроено в бустинг: его руководящий принцип — улучшать ансамбль на каждой итерации, добавляя нового голосующего, а затем решая, какой вес придавать каждому голосу.

Алгоритм:

Инициализируйте набор данных и присвойте равный вес каждой точке данных.Предоставьте это в качестве входных данных для модели и определите ошибочно классифицированные точки данных.Увеличьте вес ошибочно классифицированных точек данных.

if (got required results): 

  Goto step End 

else: 

  Goto step Start 

End














































На приведенной выше диаграмме очень просто объясняется алгоритм AdaBoost. Давайте попробуем понять это поэтапно:
B1 состоит из 10 точек данных, которые состоят из двух типов, а именно плюс (+) и минус (-), и 5 из которых плюс (+), а остальные 5 минус (-), и каждому из них изначально был присвоен одинаковый вес. Первая модель пытается классифицировать точки данных и создает вертикальную разделительную линию, но ошибочно классифицирует 3 плюс (+) как минус (-).
B2 состоит из 10 точек данных из предыдущей модели, в которой 3 ошибочно классифицированных плюса (+) имеют больший вес, так что текущая модель больше пытается правильно классифицировать эти плюсы (+). Эта модель создает вертикальную разделительную линию, которая правильно классифицирует ранее неправильно классифицированные плюсы (+), но в этой попытке она неправильно классифицирует три минуса (-).
B3 состоит из 10 точек данных из предыдущей модели, в которой 3 ошибочно классифицированных минуса (-) имеют больший вес, так что текущая модель больше пытается правильно классифицировать эти минусы (-). Эта модель генерирует горизонтальную разделительную линию, которая правильно классифицирует ранее ошибочно классифицированные минусы (-).
B4 объединяет вместе B1, B2 и B3, чтобы построить надежную модель прогнозирования, которая намного лучше, чем любая отдельная используемая модель.

(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoost.py
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
import warnings
warnings.filterwarnings("ignore")

data = pd.read_csv("Iris.csv")
# Printing the shape of the dataset
print(data.shape)
print(data.head())

X = data.iloc[:,:-1]
y = data.iloc[:,-1]
print("Shape of X is %s and shape of y is %s"%(X.shape,y.shape))
total_classes = y.nunique()
print("Number of unique species in dataset are: ",total_classes)

distribution = y.value_counts()
print(distribution)
X_train,X_val,Y_train,Y_val = train_test_split(X,y,test_size=0.25,random_state=28)

# Creating adaboost classifier model
adb = AdaBoostClassifier()
adb_model = adb.fit(X_train,Y_train)
print("The accuracy of the model on validation set is", adb_model.score(X_val,Y_val))

(.env) boris@boris-All-Series:~/ADABOOST$ python3 AdaBoost.py
(150, 5)
   sepal.length  sepal.width  petal.length  petal.width variety
0           5.1          3.5           1.4          0.2  Setosa
1           4.9          3.0           1.4          0.2  Setosa
2           4.7          3.2           1.3          0.2  Setosa
3           4.6          3.1           1.5          0.2  Setosa
4           5.0          3.6           1.4          0.2  Setosa
Shape of X is (150, 4) and shape of y is (150,)
Number of unique species in dataset are:  3
Setosa        50
Versicolor    50
Virginica     50
Name: variety, dtype: int64
The accuracy of the model on validation set is 0.9210526315789473





























Гиперпараметры AdaBoost
Исследуйте количество деревьев. Важным гиперпараметром алгоритма AdaBoost является количество деревьев решений, используемых в ансамбле.
Напомним, что каждое дерево решений, используемое в ансамбле, предназначено для слабого обучения. То есть у него есть навыки над случайным предсказанием, но он не очень искусен. Таким образом, используются одноуровневые деревья решений, называемые пнями решений.
Чтобы модель работала хорошо, количество деревьев, добавляемых в модель, должно быть большим, часто это сотни, если не тысячи. Количество деревьев можно установить с помощью аргумента «n_estimators», по умолчанию оно равно 50.В приведенном ниже примере исследуется влияние количества деревьев со значениями от 10 до 5000.
(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoostHyper.py
# explore adaboost ensemble number of trees effect on performance
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
from matplotlib import pyplot
 
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)
return X, y
 
# get a list of models to evaluate
def get_models():
models = dict()
# define number of trees to consider
n_trees = [10, 50, 100, 500, 1000, 5000]
for n in n_trees:
models[str(n)] = AdaBoostClassifier(n_estimators=n)
return models
 
# evaluate a given model using cross-validation
def evaluate_model(model, X, y):
# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate the model and collect the results
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
return scores
 
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
# evaluate the model
scores = evaluate_model(model, X, y)
# store the results
results.append(scores)
names.append(name)
# summarize the performance along the way
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()





















Выполнение примера сначала сообщает о средней точности для каждого сконфигурированного количества деревьев решений.
В этом случае мы видим, что эта производительность улучшается в этом наборе данных примерно до 50 деревьев, а после этого снижается. Это может быть признаком того, что ансамбль переоснащает набор обучающих данных после добавления дополнительных деревьев.
===========================
Исследуйте слабого ученика
===========================
Дерево решений с одним уровнем используется в качестве слабого ученика по умолчанию. Мы можем сделать используемые в ансамбле модели менее слабыми (более искусными), увеличив глубину дерева решений.
В приведенном ниже примере исследуется влияние увеличения глубины слабого ученика DecisionTreeClassifier на ансамбль AdBoost.
(.env) boris@boris-All-Series:~/ADABOOST$ cat AdaBoostWeakLR.py
# explore adaboost ensemble tree depth effect on performance
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from matplotlib import pyplot
 
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=6)
return X, y
 
# get a list of models to evaluate
def get_models():
models = dict()
# explore depths from 1 to 10
for i in range(1,11):

# define base model
base = DecisionTreeClassifier(max_depth=i)
# define ensemble model
models[str(i)] = AdaBoostClassifier(base_estimator=base)

return models
 
# evaluate a given model using cross-validation
def evaluate_model(model, X, y):
# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# evaluate the model and collect the results
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
return scores
 
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
# evaluate the model
scores = evaluate_model(model, X, y)
# store the results
results.append(scores)
names.append(name)
# summarize the performance along the way
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()





















Диаграмма с прямоугольниками и усами создается для распределения оценок точности для каждой настроенной глубины слабого обучения