<jupyter_start><jupyter_text>Получение и первичное исследование данных (EDA, exploratory data analyze)Курс "Модели и методы интеллектуального анализа данных"<NAME>., доцент кафедры ИТЗИ УрГУПС (Екатеринбург)<EMAIL>  Оглавление ВведениеИсточники данных             Текстовые файлы (txt, csv, xml, json)         Открытые программные интерфейсы (API)        Базы данных        Датасеты kaggle        sklearn.datasets        CIFAR        MNIST        Другие источники данных        Этапы предварительного (разведочного) анализа данныхПредварительное изучение данных: правильность получения, природа, целостность, актуальность, адекватностьВыявление в данных взаимосвязей, кластеровАнализ аномалий - причина, повторяемость, угроза для выборкиШкалирование признаковВыявление наиболее актуальных параметровКомбинирование признаковПроверка основных гипотез    Модели        Разработка и применение начальных простых моделей    Построение конвейеров (pipelines)        Ссылки  Введение Для работы с данными нужны сами данные :-) Большинство рабочего времени специалиста по работе с данными уходит на получение, очистку, преобразование, предварительное исследование данных. От качества этой предварительной работы зависит качество, скорость, результативность работы моделей, использующих данные. Исходные данные низкого качества не может исправить никакая модель машинного обучения (принцип garbage-in-garbage-out).Далее рассмотрены способы (источники) получения данных, этапы разведочного анализа данных (EDA), приведены примеры использования функций стандартных библиотек.Для начала практического изучения рассматриваемых вопросов можно воспользоваться ресурсом "Google colab" https://colab.research.google.com/Для удобства задачи разбиты на группы, к которым можно быстро перейти в Оглавлении. Для работы с данными существуют различные возможности, от самых простых до сложных систем бизнес-аналитики (Business Intelligence, BI)- Excel, в т.ч. множество встроенных функций и возможность простого программирования с помощью макросов Visual Basic- различные математические пакеты программ: Statistica, MathCad, Maple,...- встроенные инструменты фреймворков (PostgreSQL, Oracle)- Python (pandas, matplotlib, numpy, sklearn, scipy и другие специализированные библиотеки)Мы будем рассматривать инструментарий python. Назад к Оглавлению  Источники данных Самый нерациональный (но тем не менее часто применяющийся и в настоящее время) способ создания данных - ручное внесение информации (заполнение таблиц, создание отчетов, "набивалки"). Однако все чаще появляются проекты с автоматизированным и унифицированным способом сбора, хранения, преобразования данных (что гораздо эффективнее). Некоторые стандартные источники данных:- текстовые файлы (txt, csv, xml, json и другие форматы)- API для доступа к вебсервисам (yandex, facebook, Twitter, социальные сети, ...)- базы данных- OLAP-кубы- результаты работы IoT устройств (датчики, счетчики)- данные систем мониторингаКроме того, создано множество наборов данных (dataset), применяющихся как для обучения, так и для глобальных исследований- "игрушечные" датасеты sklearn.datasets- наборы данных на площадке соревнований по машинному обучению kaggle (kaggle.com)- наборы изображений MNIST, CIFARПолучение качественного набора данных часто еще более важная задача, чем построение модели машинного обучения. Такие данные представляют собой большую интеллектуальную ценность. В конкретных проектах таже необходимо учитывать законодательство - требования о защите персональных данных, коммерческой тайны и пр. Назад к Оглавлению  Текстовые файлы (txt, csv, xml, json)  При чтении и записи для текстового файла этот файл необходимо открыть в соответствующем режиме ('r' - read/чтение, 'w' - write/запись, 'a' - append/добавление).<jupyter_code>path_ = './data.txt'

with open(path_, 'w') as f: 
    f.write('1,2,3\n')
f.close()

with open(path_, 'r') as f: 
    s = f.read()
f.close()

print(s, end="")

if os.path.isfile(path_):
    os.remove(path_)<jupyter_output>1,2,3<jupyter_text>csv (comma sepatered value) это текстовые файлы специального вида, данные разделены специальным символом, чаще всего запятой.<jupyter_code>path_ = './data.csv'

with open(path_, 'w') as f: 
    f.write('1,2,3\n')
    f.write('4,5,6')
f.close()

with open(path_, 'r') as f: 
    data = [s.split(",") for s in f.read().split('\n')]
f.close()

print(data)

df = pd.read_csv(path_, names=list("ABC"))
display(df)

if os.path.isfile(path_):
    os.remove(path_)<jupyter_output>[['1', '2', '3'], ['4', '5', '6']]<jupyter_text>xml (extensible markup language) - язык разметки данных с использованием специальный блоков, обозначаемых тегами. Пример xml файла:<jupyter_code>%%html
<xmp>
<?xml version="1.0" ?>
<Appointments>
    <appointment>
        <begin>1181251680</begin>
        <uid>040000008200E000</uid>
        <alarmTime>1181572063</alarmTime>
    </appointment>
</Appointments>
</xmp><jupyter_output><empty_output><jupyter_text>Существуют различные стандартные билиотеки для работы с xml, например, в Python это minidom, ElementTree, BeautifulSoap Объектная нотация JSON (JavaScript Object Notation) используется при сериализации структур данных (преобразованию к виду, похожему на словарь).<jupyter_code>import json
d = {'personal data': {   
                        'surname': 'Ivanov', 
                        'name': 'Ivan'
                    },
    'age': 42, 'height': 171, 'weight': 80}
print(d)

s = json.dumps(d)
print(s)

d = json.loads(s)
print(d)<jupyter_output>{'personal data': {'surname': 'Ivanov', 'name': 'Ivan'}, 'age': 42, 'height': 171, 'weight': 80}
{"personal data": {"surname": "Ivanov", "name": "Ivan"}, "age": 42, "height": 171, "weight": 80}
{'personal data': {'surname': 'Ivanov', 'name': 'Ivan'}, 'age': 42, 'height': 171, 'weight': 80}<jupyter_text>Назад к Оглавлению  Открытые программные интерфейсы API  Экспортируем данные из открытого API github.com<jupyter_code>import requests
endpoint = 'https://api.github.com/users/yurichernyshov/repos'
repos = json.loads(requests.get(endpoint).text)
for elem in repos:
    print(elem['name'])<jupyter_output>BlogNote
Data-Science-Course-USURT
datasets
Examples
Games
Information-Systems-Course-USURT
PRE
simbank
usurt-docker-practice<jupyter_text>В большинстве API вебсервисов перед использованием необходимо зарегистрироваться и получить ключ. Пример испольнования запроса с истекшим токеном:<jupyter_code>!curl -H 'X-Gismeteo-Token: <PASSWORD>' 'https://api.gismeteo.net/v2/weather/current/4368/'<jupyter_output>{"meta":{"message":"Invalid token. Check the 'X-Gismeteo-Token' header","code":401},"response":{}}<jupyter_text>Назад к Оглавлению  Базы данных  Стандартным источником информации в производственных информационных системах являются базы данных - хранилища большого объема информации. В зависимости от прикладных задач для хранения данных может быть выбран соответствующий тип базы данных (реляционная, NoSQL, графовая). На выбор типа БД является: структура информации для хранения (эффективно ли зранить в таблицах), тип файлов, необходимая скорость доступа, взаимосвязи между элементами. Для работы с реляционными базами данных используют SQL запросы.Примеры SQL запросов:SELECT model, speed, hd FROM PC WHERE priceSELECT model,price FROM Printer      WHERE price=(SELECT MAX(price) FROM Printer)    SELECT DISTINCT Product.type, Laptop.model, Laptop.speed FROM Product    JOIN Laptop ON Laptop.model=Product.model    WHERE speed ANY (SELECT MIN(speed)FROM PC) Для python существует легкая база данных SQLite, хорошо подходящая для небольших проектов.<jupyter_code>import sqlite3

path_ = './mydb.db'

conn = sqlite3.connect(path_)

c = conn.cursor()
c.execute("CREATE TABLE test (name char(255), id int);")
c.fetchall()

c = conn.cursor()
c.execute("INSERT INTO test VALUES ('Petr', 1);")
c.fetchall()

c = conn.cursor()
c.execute("SELECT * FROM test;")
c.fetchall()
# удалим файл с базой данных
if os.path.isfile(path_):
    os.remove(path_)
    
os.path.isfile(path_)<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Датасеты kaggle  Платформа для соревнований по машинному обучению https://www.kaggle.com/datasets содержит большое количество данных, один из критериев оценки участников сообщества kaggle - оценка размещенных участниками датасетов. Содержит как тренировочные данные, так и данные для решения глобальных задач (предсказание объема продаж Walmart, предсказание динамики распространения коронавируса)  sklearn.datasets  sklearn.datasets содержит много заранее подготовленных "игрушечных" датасетов небольшого размера, на которых удобно изучать применение различных методов машинного обучения. Есть датасеты для задач классификации, регрессии, распознавания текстов, разпознавания изображений. Например:- load_digits() - 1797 образцов рукописных цифр, для тренировки алгоритмов классификации изображений- load_boston() - 697 образцов цен на жилье, для тренировки алгоритмов регрессии- load_iris() - 150 образцов измерений цветка ириса, для тренировки алгоритмов классификацииТакже можно создать наборы данных самостоятельно с использованием функций sklearn make_regression, make_classification, make_blobs<jupyter_code>from sklearn.datasets import make_friedman1
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
print(len(X), len(X[0]))<jupyter_output>50 10<jupyter_text>С помощью функции sklear.dataset.make_circles можно создать множество точек.<jupyter_code>from matplotlib import pyplot as plt
import numpy as np
from sklearn.datasets import make_circles
points, color = make_circles(n_samples=1000, shuffle=True, noise=0.3, random_state=1, factor=0.3)
plt.scatter(np.array(points)[:,0],np.array(points)[:,1], c=color)
plt.show()<jupyter_output><empty_output><jupyter_text>Набор рукописных цифр.<jupyter_code>from sklearn.datasets import load_digits
data = load_digits()
fig, ax = plt.subplots(1, 10, figsize=(10,5))
for i in range(10):
    ax[i].imshow(data.data[i].reshape(8,8), cmap='gray')
    ax[i].grid(False)
    ax[i].axis('off')
    ax[i].set_title(data.target[i])
dir(data)<jupyter_output><empty_output><jupyter_text>Набор изображений.<jupyter_code>from sklearn.datasets import load_sample_images
data = load_sample_images()
plt.imshow(data.images[1])
plt.show()<jupyter_output><empty_output><jupyter_text>Также в scikit-learn есть удобная функция, которая позволяет импортировать данные напрямую с сайта openml.org, на котором хранится более 21000 различных датасетов.<jupyter_code>from sklearn.datasets import fetch_openml
X, y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)
X.shape, y.shape
X
y<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  CIFAR  Назад к Оглавлению  MNIST  Назад к Оглавлению  Другие источники данных  Через открытые источники можно получать информацию для анализа из социальных сетей, twitter и т.п.Перечень популярных API (например, прогноз погоды, фильмы, финансовый анализ) для Python можно найти здесь: https://rapidapi.com/collection/list-of-python-apis Назад к Оглавлению  Этапы предварительного (разведочного) анализа данных   Типовой набор данных для демонстрации работы методов<jupyter_code>num = 100
df = pd.DataFrame({
        'Date': pd.date_range('20130102', periods=num, freq='1w'),
        'Visitors': np.random.randint(0,10, num),
        'Income': np.random.random(num)*100,
        'Type': pd.Categorical(np.random.choice(['Regular', 'Unique', 'Irregular'], size=num)),
        'Par1': np.random.choice(np.r_[np.linspace(-10,10,20), np.NaN*10], size=num)
                  })
df
df.head(2)
df.tail(1)
print("df.shape: {}, rows: {}, columns: {}".format(df.shape, df.shape[0], df.shape[1]))
df.info(), df.Par1.isna().sum()
df.describe()<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Предварительное изучение данных: правильность получения, природа, целостность, актуальность, адекватность   Пример некорректных данных     ДатаФИОРезультат            29 декабря 2019Иванов И.И.14.01                29 декабря 1019Иванов Ваня12,02                31 февраля 202014                01 апреля 2020Петров П.П.-100     Типичные ошибки: некорректные даты, разные форматы ФИО (отсутствует отчество), разные форматы чисел, пропущенные данные. В библиотеке pandas реализовано множество методов для анализа данных.Общая информация о данных    df.info() - общая информация о таблице (индексы, строки, типы, ненулевые значения),        df.shape() - размеры,         df.columns(), df.index() - колонки, индексы        df.describe(), df.describe(include=['object', 'bool']) - общая статистическая информация по численным значениямАгрегированная информация о данных    df.value_counts() - подсчет частотности значений для типов Categorical и Boolean,    df.sort_values(by='название столбца', ascending=False/True) - сортировка,    df.mean(), .min(), .max(), .std(), .var(), .count() - агрегационные функции,    groupby, crosstab, pivot_table - сводные таблицы  Типы данных, пропущенные значения<jupyter_code>df.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   Date      100 non-null    datetime64[ns]
 1   Visitors  100 non-null    int64         
 2   Income    100 non-null    float64       
 3   Type      100 non-null    category      
 4   Par1      99 non-null     float64       
dtypes: category(1), datetime64[ns](1), float64(2), int64(1)
memory usage: 3.5 KB<jupyter_text>Информация о столбцах df.columns<jupyter_code>print(df.columns)
for vColName in df.columns[1::2]:
    print("{}: {}".format(vColName, df[vColName].unique()))<jupyter_output>Index(['Date', 'Visitors', 'Income', 'Type', 'Par1'], dtype='object')
Visitors: [2 1 5 0 4 6 8 3 9 7]
Type: ['Regular', 'Unique', 'Irregular']
Categories (3, object): ['Regular', 'Unique', 'Irregular']<jupyter_text>Статистическая информация<jupyter_code>df
fig, ax = plt.subplots(1,3)
fig.set_figwidth(15)
fig.set_figheight(2)
for i, vColName in enumerate(['Visitors', 'Income','Par1']):
    ax[i].boxplot(df[vColName].dropna())
    ax[i].set_xlabel(vColName)  
    ax[i].legend([round(f(df[vColName].dropna()),2) for f in [min,max,np.mean,np.median]],loc=1)
plt.show()
df.describe()
df<jupyter_output><empty_output><jupyter_text>groupby<jupyter_code>df.groupby('Type')['Income'].max()
df.groupby('Type')['Income'].max().plot(kind='bar')
plt.show()
df.groupby('Type')['Income'].sum()<jupyter_output><empty_output><jupyter_text>crosstab Показывает для двух категориальных типов количество пересечений их значений.<jupyter_code>pd.crosstab(df['Type'], df['Visitors'])<jupyter_output><empty_output><jupyter_text>pivot_table Строит агрегирующие статистические таблицы - столбцы и колонки объединяются в группы по определенным признакам и для этих групп вычисляются агрегационные функции (сумма, минимум, максимум всех значений в группе и т.п.)<jupyter_code>df<jupyter_output><empty_output><jupyter_text>Найти сумму выручки ('Income') для конкретных значений Type и Visitor.<jupyter_code>df.pivot_table(index='Type', columns='Visitors', values='Income', aggfunc={np.sum}, fill_value=0)<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Выявление в данных взаимосвязей, кластеров   Парадокс Симпсона Выявленные закономерности в отдельных частях выборки могут коренным образом отличаться от аналогичных закономерностей для всей выборки, что может вводить исследователей данных в заблуждение. Ниже пример, когда для каждой из двух частей (синей и желтой) выборки корреляция отрицательная, а в целом для выборки (зеленая) - положительная.<jupyter_code>np.random.seed(7)
Yellows = np.random.random(size=(10,2))+1
Blues = np.random.random(size=(10,2))+2
Greens = np.r_[Yellows, Blues]
plt.scatter(Yellows[:, 0], Yellows[:, 1], color="y", s=200)
plt.scatter(Blues[:, 0], Blues[:, 1], color="b", s=200)
plt.scatter(Greens[:, 0], Greens[:, 1], color="g")
plt.show()
plt.scatter(Yellows[:, 0], Yellows[:, 1], color="y", s=200)
plt.scatter(Blues[:, 0], Blues[:, 1], color="b", s=200)
plt.scatter(Greens[:, 0], Greens[:, 1], color="g", s=50)

model = LinearRegression()

model.fit(Blues[:, 0].reshape(-1, 1), Blues[:, 1])
plt.plot(Blues[:, 0], model.predict(Blues[:, 0].reshape(-1,1)), color="b")

model.fit(Yellows[:, 0].reshape(-1, 1), Yellows[:, 1])
plt.plot(Yellows[:, 0], model.predict(Yellows[:, 0].reshape(-1, 1)), color="y")

model.fit(Greens[:, 0].reshape(-1, 1), Greens[:, 1])
plt.plot(Greens[:, 0], model.predict(Greens[:, 0].reshape(-1, 1)), color="g")

plt.show()<jupyter_output><empty_output><jupyter_text>Корреляция Показывает линейную взаимосвязь между отдельными столбцами данных.<jupyter_code>df.corr()
sns.heatmap(df.corr(), annot=True)
plt.show()<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Анализ аномалий - причина, повторяемость, угроза для выборки   pyplot.boxplot Удобное средство визуализации данных. Можно увидеть минимум, максимум, медиану, 25% и 75% перцентили, выбросы.<jupyter_code>spikes = [-25, 25]
x = np.r_[np.random.randint(low=-10, high=10, size=100), spikes]

plt.figure(figsize=(10,1))
plt.boxplot(x, vert=False)
plt.xticks(np.arange(x.min(), x.max()+1, 5))
plt.grid(True)
plt.show()<jupyter_output><empty_output><jupyter_text>Влияние выбросов на качество модели Причиной выброса может быть неисправность прибора, ошибка измерения и т.п. В том случае если значение выброса существенно отличается от остальных значений - он может сильно исказить общую картину.<jupyter_code>xs = np.linspace(0, 10, 10)
ys = xs**2 + 3*np.random.random(10)

model = LinearRegression()
xs_poly = PolynomialFeatures(2).fit_transform(xs.reshape(-1,1))
model.fit(xs_poly, ys)
result = model.predict(xs_poly)

plt.scatter(xs, ys, c='b', s=150)
plt.plot(xs, result, c='b')


ys[3] = 200
xs_poly = PolynomialFeatures(2).fit_transform(xs.reshape(-1,1))
model.fit(xs_poly, ys)
result = model.predict(xs_poly)

plt.scatter(xs, ys, c='r')
plt.plot(xs, result, c='r')

plt.grid(True)
plt.show()<jupyter_output><empty_output><jupyter_text>В зависимости от конкретной ситуации выбросы можно удалять из общей выборки, заменять средним значением, применять логарифмирование, либо добавлять специальный признак выброса, чтобы информировать модель. Назад к Оглавлению  Шкалирование признаков  Масштабирование значений признаков (шаклирование) необходимо для большинства моделей для того, чтобы привести значения разных признаков к одной шкале.  Заменить значения из диапазона (0,100) значениями из диапазона (0,10)<jupyter_code>np.random.seed(1)
a = np.random.randint(1, 101, 10)
print(a)

# sklearn.preprocessing.MinMaxScaler()
minmax_scale = MinMaxScaler(feature_range=(0,10))
a_scaled = minmax_scale.fit_transform(a.reshape(-1,1))
print(np.round(a_scaled.ravel(),2))<jupyter_output>[38 13 73 10 76  6 80 65 17  2]
[ 4.62  1.41  9.1   1.03  9.49  0.51 10.    8.08  1.92  0.  ]<jupyter_text>Преобразовать данные, чтобы среднее значение было 0, а дисперсия - 1<jupyter_code>plt.bar([i for i in range(len(a))], a)
plt.show()
# sklearn.preprocessing.StandardScaler()
a_norm_scaled = StandardScaler().fit_transform(a.reshape(-1,1))
plt.bar([i for i in range(len(a))], a_norm_scaled.flatten())
sns_plot = sns.displot(a_norm_scaled)<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Выявление наиболее актуальных параметров  Некоторые признаки оказывают на моделируемый процесс существенно меньшее влияние, чем остальные. Иногда целесообразно отказаться от части признаков (столбцов данных) с назначительной потерей качества, но значительным выигрышем в скорости вычислений.<jupyter_code>from sklearn.datasets import load_iris
data = load_iris()
dir(data)
pd.DataFrame(data.data, columns=data.feature_names).head(3)
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, 
                                                    test_size=0.3, shuffle=True, 
                                                    stratify=data.target,
                                                    random_state=1)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
model = DecisionTreeClassifier(random_state=42).fit(X_train, y_train)
plt.bar(x=range(4), height=model.feature_importances_)
plt.xticks(range(4))
plt.show()
print(model.feature_importances_)
print(model.score(X_test, y_test))
model = DecisionTreeClassifier(random_state=42).fit(X_train[:,2].reshape(-1,1), y_train)
plt.show()
print(model.score(X_test[:,2].reshape(-1,1), y_test))<jupyter_output>0.9111111111111111<jupyter_text>Назад к Оглавлению  Комбинирование признаков, конструирование новых признаков   Линейные комбинации признаковИногда полезно из имеющихся признаков составить новые, используя различные математические операции: сложение, вычитание, деление, умножение на константу, вычисление экспоненты, логарифмирование.<jupyter_code>xs = np.linspace(0, 10, 10)
ys = xs**3 + np.random.random(10)*2

model = LinearRegression()
model.fit(xs.reshape(-1,1), ys)
result1 = model.predict(xs.reshape(-1,1))

xs_poly = PolynomialFeatures(3).fit_transform(xs.reshape(-1,1))
model.fit(xs_poly, ys)
result2 = model.predict(xs_poly)

plt.plot(xs, xs**3, c='b')
plt.scatter(xs, result1, c='r')
plt.scatter(xs, result2, c='g')

plt.show()
#preprocessing.FunctionTransformer<jupyter_output><empty_output><jupyter_text>Группировка признаков с помощью кластеризации<jupyter_code>from sklearn.cluster import KMeans
a = np.array([np.random.randint(1,100) for _ in range(10)])
print(a)
print(KMeans(3).fit(a.reshape(-1,1)).predict(a.reshape(-1,1)))<jupyter_output>[88 88 95 97 87 14 10  8 64 62]
[1 1 1 1 1 0 0 0 2 2]<jupyter_text>Назад к Оглавлению  Проверка основных гипотез     <NAME>    Проверка законов распределения    A/B тестирование<jupyter_code>from scipy.stats import pearsonr
# тест корреляции Пирсона
corr, p = pearsonr(xs, ys)
print(corr, p)
# тест Стьюдента (различие образцов)
from scipy.stats import ttest_ind
stat, p = ttest_ind(xs, ys)
print(stat, p)<jupyter_output>-2.509612863424833 0.021866443220159848<jupyter_text>Назад к Оглавлению  Модели   Разработка и применение начальных простых моделей  Для обработанных данных требуется построить простую модель, чтобы убедиться в возможности использовать данные для более сложных моделей.<jupyter_code>num = 25
xs = np.linspace(-5, 5, num)
ys = xs**4 - 10*xs**3 + 100*xs - 10 + np.random.random(num)*5<jupyter_output><empty_output><jupyter_text>Очень приблизительную первоначальную оценку (baseline) можно получить с помощью примитивных моделей - sklearn.dummyDummyClassifier (для классификации)- sklearn.dummyDummyRegressor (для регрессии)<jupyter_code>dummy = DummyRegressor()

dummy.fit(np.array(xs).reshape((-1,1)), ys)
xs1 = np.linspace(-5, 10, num)
plt.plot(xs1, dummy.predict(np.array(xs1).reshape(-1,1)), c='g')

plt.scatter(xs, ys)
plt.scatter(10, dummy.predict(np.array([10]).reshape(-1,1)), c='r')

plt.show()<jupyter_output><empty_output><jupyter_text>Для более точных результатов надо использовать стандартные модели.<jupyter_code>linreg = LinearRegression()

linreg.fit(np.array(xs).reshape((-1,1)), ys)
xs1 = np.linspace(-5, 10, num)
plt.plot(xs1, linreg.predict(np.array(xs1).reshape(-1,1)), c='g')

plt.scatter(xs, ys)
plt.scatter(10, linreg.predict(np.array([10]).reshape(-1,1)), c='r')

plt.show()
linreg.coef_<jupyter_output><empty_output><jupyter_text>Назад к Оглавлению  Создание конвейеров (pipelines)  Около 80% времени работы с данными уходит на обработку данных, поэтому на данном этапе важна качественная автоматизация. Для объединения последовательности стандартных действий по обработке данных (например, удаление пустых значений, масштабирование и построение линейной регрессии) используют пайплайны. В библиотеке для этого есть инструменты- sklearn.pipeline.make_pipeline- sklearn.pipeline.Pipeline<jupyter_code>num = 25
xs = np.linspace(-5, 5, num)
ys = xs**4 - 10*xs**3 + 100*xs - 10 + np.random.random(num)*5
pipeline1 = make_pipeline(LinearRegression())
pipeline2 = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline3 = make_pipeline(PolynomialFeatures(3), LinearRegression())
pipeline4 = make_pipeline(PolynomialFeatures(4), LinearRegression())
plt.scatter(xs, ys, c='b')
plt.plot(xs, pipeline1.fit(xs.reshape(-1,1), ys).predict(xs.reshape(-1,1)))
plt.plot(xs, pipeline2.fit(xs.reshape(-1,1), ys).predict(xs.reshape(-1,1)))
plt.plot(xs, pipeline3.fit(xs.reshape(-1,1), ys).predict(xs.reshape(-1,1)))
plt.plot(xs, pipeline4.fit(xs.reshape(-1,1), ys).predict(xs.reshape(-1,1)))
plt.show()
pipeline4
print("Найденные коэффициенты:", " ".join([str(round(c,2)) for c in pipeline4[1].coef_]))<jupyter_output>Найденные коэффициенты: 0.0 99.7 0.02 -9.98 1.0
{'fraction_non_alphanumeric': 0.12074567459995127, 'fraction_numerical': 0.028023718625619365, 'mean_word_length': 5.597802786709539, 'pattern_counts': {'":': 10, '<': 142, '<?xml version=': 1, '>': 142, 'https://': 5, 'lorem ipsum': 0, 'www.': 1, 'xml': 7}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '34', 'dir': 'jupyter-structured-clean-dedup', 'id': '663972', 'license': 'CC0-1.0', 'n_tokens_mistral': 10058, 'n_tokens_neox': 10778, 'n_words': 2141, 'path': 'lessons/lec-DA-EDA.ipynb', 'repo_name': 'yurichernyshov/Data-Science-Course-USURT', 'size': '24688'}