24 KiB
Lab2 Pibd-31 Malafeev
Загрузка трёх других датасетов(не своего варианта)
import pandas as pd
df = pd.read_csv(".//datasetlab2//kc_house_data.csv", sep=",")
df2 = pd.read_csv(".//datasetlab2//Stores.csv", sep=",")
df3 = pd.read_csv(".//datasetlab2//Forbes Billionaires.csv", sep=",")
Далее будут выполнены в Markdown пукнты лабораторной 2-8 с пометкой каждого пункта.
2.Проблемной областью явлются: датасет stores.csv - магазины, kc_house_data.csv - датасет продажи домов и Forber Billionares.csv - датасет миллионеров.
3.Объектами наблюдениями явлются магазины, дома и миллионеры. Связи между объектами нет, единственная схожесть - магазин и дом являются зданиями.
4.Датасет миллионеров нужны например для сайта forbes - чтобы составить тир лист. В целом, другие датасеты тоже подходят для составления тир листа)
5.Технический проект - тир лист, на входе датасет
6.Пункт будем выполнять в коде, оставлю к каждому комменты:
# Проверка на пропущенные значения
print(df.isnull().sum())
print(df2.isnull().sum())
print(df3.isnull().sum())
# Статистика по числовым данным для выявления аномальных распределений
print(df.describe())
print(df2.describe())
print(df3.describe())
7.По перым трём строкам кода, т.е после проверки на пропущенные значения выявлено, что их нет. А дальше я обнаружил аномалию: в датасете миллионеров есть столбец networth - чистое количество денег во всех формах ( в миллиардах ), в этом солбце минимальное значение является единицей, медиана в районе 2.4, а максимальное - 219. В ЭТОМ СТОЛБЦЕ АНОМАЛИЯ
8.Наши датасеты довольно информационные. Например у миллионер датасета можно посмотреть фио, сколько денег, что он сделал. Датасет по продаже домов гораздо информационнее, является лидером по наполненности и соответствует реальности. А вот датасет магазинов слабоват, можно например добавить: количество филлиалов, работников, прибыль
9.Возьмём датасет магазинов, будем удалять столбцы, где площадь ниже 1500 (по тз надо)
df2_filtered = df2[df2['Store_Area'] >= 1500]
print(df2_filtered)
Теперь в датасете магазнов price заменим у всех на константное значение - 1 500 000
df['price'] = 1500000
print(df)
Теперь у миллионеров в networth подставим среднее по столбцу:
networth_mean = df3['Networth'].mean()
df3['Networth'] = networth_mean
print(df3[['Networth']])
10.КОД
from sklearn.model_selection import train_test_split
train_df, temp_df = train_test_split(df, test_size=0.3, random_state=42)
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
train_df2, temp_df2 = train_test_split(df2, test_size=0.3, random_state=42)
val_df2, test_df2 = train_test_split(temp_df2, test_size=0.5, random_state=42)
train_df3, temp_df3 = train_test_split(df3, test_size=0.3, random_state=42)
val_df3, test_df3 = train_test_split(temp_df3, test_size=0.5, random_state=42)
print(f"Train df: {train_df.shape}, Validation df: {val_df.shape}, Test df: {test_df.shape}")
print(f"Train df2: {train_df2.shape}, Validation df2: {val_df2.shape}, Test df2: {test_df2.shape}")
print(f"Train df3: {train_df3.shape}, Validation df3: {val_df3.shape}, Test df3: {test_df3.shape}")
Было сделаное разбиение на три выборки: 70%, 15% и 15%. Подключена была библиотека scikit-learn и функция train_test_split , как сказано в пункте 15. Вполне сбалансированные
12.Качаем библиотеку imbalanced-learn, достаём нужные функции и погнали
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
df = pd.read_csv(".//datasetlab2//kc_house_data.csv", sep=",")
df['price_category'] = pd.cut(df['price'], bins=[0, 300000, 600000, 1000000, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y = df['price_category']
X = df.drop(columns=['price', 'price_category'])
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y)
undersampler = RandomUnderSampler(random_state=42)
X_resampled_under, y_resampled_under = undersampler.fit_resample(X, y)
print("Class distribution after oversampling (df):")
print(pd.Series(y_resampled).value_counts())
print("Class distribution after undersampling (df):")
print(pd.Series(y_resampled_under).value_counts())
df3 = pd.read_csv(".//datasetlab2//Forbes Billionaires.csv", sep=",")
df3['AGE_category'] = pd.cut(df3['Age'], bins=[0, 30, 50, 70, float('inf')],
labels=['Young', 'Middle-aged', 'Senior', 'Elderly'])
y3 = df3['AGE_category']
X3 = df3.drop(columns=['Age', 'AGE_category'])
oversampler3 = RandomOverSampler(random_state=42)
X_resampled_3, y_resampled_3 = oversampler3.fit_resample(X3, y3)
undersampler3 = RandomUnderSampler(random_state=42)
X_resampled_3_under, y_resampled_3_under = undersampler3.fit_resample(X3, y3)
print("Class distribution after oversampling (df3):")
print(pd.Series(y_resampled_3).value_counts())
print("Class distribution after undersampling (df3):")
print(pd.Series(y_resampled_3_under).value_counts())
df2 = pd.read_csv(".//datasetlab2//Stores.csv", sep=",")
df2['Sales_category'] = pd.cut(df2['Store_Sales'], bins=[0, 50000, 100000, 200000, float('inf')],
labels=['Low', 'Medium', 'High', 'Luxury'])
y2 = df2['Sales_category']
X2 = df2.drop(columns=['Store_Sales', 'Sales_category'])
oversampler2 = RandomOverSampler(random_state=42)
X_resampled_2, y_resampled_2 = oversampler2.fit_resample(X2, y2)
undersampler2 = RandomUnderSampler(random_state=42)
X_resampled_2_under, y_resampled_2_under = undersampler2.fit_resample(X2, y2)
print("Class distribution after oversampling (df2):")
print(pd.Series(y_resampled_2).value_counts())
print("Class distribution after undersampling (df2):")
print(pd.Series(y_resampled_2_under).value_counts())