178 KiB
178 KiB
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("C://Users//annal//aim//static//csv//Forbes_Billionaires.csv")
Проверим выбросы и усредним¶
In [2]:
numeric_columns = ['Networth', 'Age']
for column in numeric_columns:
if pd.api.types.is_numeric_dtype(df[column]): # Проверяем, является ли колонка числовой
q1 = df[column].quantile(0.25) # Находим 1-й квантиль (Q1)
q3 = df[column].quantile(0.75) # Находим 3-й квантиль (Q3)
iqr = q3 - q1 # Вычисляем межквантильный размах (IQR)
# Определяем границы для выбросов
lower_bound = q1 - 1.5 * iqr # Нижняя граница
upper_bound = q3 + 1.5 * iqr # Верхняя граница
# Подсчитываем количество выбросов
outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
outlier_count = outliers.shape[0]
# Устраняем выбросы: заменяем значения ниже нижней границы на саму нижнюю границу, а выше верхней — на верхнюю
df[column] = df[column].apply(lambda x: lower_bound if x < lower_bound else upper_bound if x > upper_bound else x)
print(f"Колонка {column}:")
print(f" Есть выбросы: {'Да' if outlier_count > 0 else 'Нет'}")
print(f" Количество выбросов: {outlier_count}")
print(f" Минимальное значение: {df[column].min()}")
print(f" Максимальное значение: {df[column].max()}")
print(f" 1-й квантиль (Q1): {q1}")
print(f" 3-й квантиль (Q3): {q3}\n")
Превратим номинальные столбцы в числовые¶
In [ ]:
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# Определение категориальных признаков для преобразования
categorical_columns = ['Name']
# Инициализация OneHotEncoder
encoder = OneHotEncoder(sparse_output=False, drop="first")
# Применение OneHotEncoder к выбранным категориальным признакам
encoded_values = encoder.fit_transform(df[categorical_columns])
# Получение имен новых закодированных столбцов
encoded_columns = encoder.get_feature_names_out(categorical_columns)
# Преобразование в DataFrame
encoded_values_df = pd.DataFrame(encoded_values, columns=encoded_columns)
# Объединение закодированных значений с оригинальным DataFrame, исключив исходные категориальные столбцы
df = df.drop(columns=categorical_columns)
df = pd.concat([df.reset_index(drop=True), encoded_values_df.reset_index(drop=True)], axis=1)
# Применение Label Encoding для столбца 'Country', 'Source', 'Industry'
label_encoder = LabelEncoder()
df['Country'] = label_encoder.fit_transform(df['Country'])
df['Source'] = label_encoder.fit_transform(df['Source'])
df['Industry'] = label_encoder.fit_transform(df['Industry'])
print(df.head())
Создадим выборки данных по параметру места в рейтинге¶
In [4]:
from sklearn.model_selection import train_test_split
# Выделение признаков (X) и целевой переменной (y)
X = df.drop(columns=['Rank ']) # Признаки
y = df['Rank '] # Целевая переменная
# Разделение данных на обучающую и временную выборки
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
# Разделение временной выборки на контрольную и тестовую выборки
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
# Проверка размеров выборок
print(f"Размер обучающей выборки: {X_train.shape}")
print(f"Размер контрольной выборки: {X_val.shape}")
print(f"Размер тестовой выборки: {X_test.shape}")
In [5]:
import seaborn as sns
import matplotlib.pyplot as plt
# Функция для оценки распределения цены
def plot_distribution(y_data, title):
plt.figure(figsize=(10, 6))
sns.histplot(y_data, kde=True, bins=50)
plt.title(title)
plt.xlabel('Rank ')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()
# Оценка распределения цены в каждой выборке
plot_distribution(y_train, "Распределение места в обучающей выборке")
plot_distribution(y_val, "Распределение места в контрольной выборке")
plot_distribution(y_test, "Распределение места в тестовой выборке")
Применим min-max нормировку для улучшения качества работы модели¶
In [6]:
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# Предполагаем, что вы уже выделили ваши признаки X
# Применение нормировки Min-Max к всем числовым признакам
min_max_scaler = MinMaxScaler()
X_normalized = pd.DataFrame(min_max_scaler.fit_transform(X), columns=X.columns)
# Применение стандартизации к всем числовым признакам
standard_scaler = StandardScaler()
X_standardized = pd.DataFrame(standard_scaler.fit_transform(X), columns=X.columns)
# Проверка первых 5 строк после нормировки
print("Нормированные данные:")
print(X_normalized.head())
# Проверка первых 5 строк после стандартизации
print("\nСтандартизированные данные:")
print(X_standardized.head())
In [7]:
pip install --upgrade featuretools
In [8]:
pip install --upgrade setuptools
In [ ]:
import featuretools as ft
from woodwork.logical_types import Categorical, Integer
import pandas as pd
df = pd.read_csv("C://Users//annal//aim//static//csv//Forbes_Billionaires.csv")
df['id'] = pd.Series(range(len(df)))
# Создание двух таблиц: одна с моделью, другая с остальными данными
country_df = df[['id', 'Country']].drop_duplicates().reset_index(drop=True)
other_df = df.drop(columns=['Country'])
# Создание уникального идентификатора для связи
country_df['country_id'] = country_df.index
other_df['country_id'] = other_df['id'].map(country_df.set_index('id')['country_id'])
es = ft.EntitySet(id="orders")
es = es.add_dataframe(
dataframe_name="country_table",
dataframe=country_df,
index="country_id", # Индекс для уникальной идентификации моделей
logical_types={
"Country": Categorical # Определяем логический тип для модели
},
)
es = es.add_dataframe(
dataframe_name="other_about_billioner",
dataframe=other_df,
index="billioner_id", # Индекс для уникальной идентификации миллиардеров
logical_types={
"Rank ": Integer, # Целевая переменная (цена)
"Networth": Integer,
"Age": Integer,
"country_id": Integer,
},
)
es = es.add_relationship("country_table", "country_id", "other_about_billioner", "country_id")
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name="other_about_billioner"
)
feature_matrix
Out[ ]: