1. В наборе данных имеется одно пропущенное значение.

Известные значения после сортировки:

25, 28, 30, 32, 35, 120.

Медиана:

(30 + 32) / 2 = 31.

После заполнения пропуска набор принимает вид:

25, 30, 28, 31, 35, 32, 120.

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

Реализация на Python:

import numpy as np

from sklearn.impute import SimpleImputer

 

X = np.array([

    [25], [30], [28],

    [np.nan], [35], [32], [120]

])

 

imputer = SimpleImputer(strategy="median")

X_filled = imputer.fit_transform(X)

 

print("Медиана:", imputer.statistics_[0])

print("Данные:", X_filled.ravel())

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

2. Признак «Способ оплаты» содержит три уникальные категории: Карта, Наличные, Перевод.

Результат One-Hot Encoding:

Способ оплаты

Карта

Наличные

Перевод

Карта

1

0

0

Наличные

0

1

0

Карта

1

0

0

Перевод

0

0

1

Наличные

0

1

0

Реализация на Python:

import numpy as np

from sklearn.preprocessing import OneHotEncoder

 

X = np.array([

    ["Карта"],

    ["Наличные"],

    ["Карта"],

    ["Перевод"],

    ["Наличные"]

])

 

encoder = OneHotEncoder(sparse_output=False)

X_encoded = encoder.fit_transform(X)

 

print(encoder.get_feature_names_out())

print(X_encoded)

Присвоение категориям чисел 1, 2 и 3 может создавать искусственный порядок и расстояния между ними. Например, алгоритм может интерпретировать категорию 3 как большую по значению, чем категория 1, хотя способы оплаты не обладают естественной количественной шкалой.

3. Матрица признаков содержит площадь и возраст здания. Целевой вектор содержит стоимость недвижимости.

Реализация на Python:

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.pipeline import make_pipeline

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LinearRegression

from sklearn.metrics import mean_absolute_error

 

X = np.array([

    [45, 20],

    [60, 15],

    [75, 10],

    [90, 5],

    [55, 18],

    [80, 8]

])

 

y = np.array([20, 28, 36, 45, 25, 40])

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.33,

    random_state=42

)

 

model = make_pipeline(

    StandardScaler(),

    LinearRegression()

)

 

model.fit(X_train, y_train)

 

predictions = model.predict(X_test)

 

print("Прогнозы:", predictions)

print("Фактические значения:", y_test)

print("MAE:", mean_absolute_error(y_test, predictions))

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

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

Использование Pipeline позволяет избежать данной ошибки. Из-за малого объёма приведённого набора результаты тестирования носят исключительно учебный характер.