392 KiB
https://www.kaggle.com/datasets/harishkumardatalab/medical-insurance-price-prediction Набор представляет собой данные о мед страховке. Пример цели: Рассчитать стоимость будущей страховки Входные данные: возраст, пол, индекс массы тела, дети, курит ли, регион, стоимость
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//Medical_insurance.csv")
print(df.columns)
# Визуализация данных - ящик с усами. Как видим - выборка относительно сбалансированна, пускай и смещена в меньшую сторону. Пустых значений нет.
plt.figure(figsize=(10, 6))
sns.boxplot(x=df["age"])
plt.title("Box Plot для age")
plt.xlabel("Age")
plt.show()
#Визуализируем отношение стоимости и возраста
plt.figure(figsize=(10, 6))
plt.scatter(df["age"], df["charges"])
plt.xlabel('Age')
plt.ylabel("Charge")
plt.title('Scatter Plot of Age vs Charge')
plt.show()
# Есть шумы, убираем
# Статистический анализ для определения выбросов
Q1 = df["charges"].quantile(0.25)
Q3 = df["charges"].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df["charges"] < (Q1 - threshold)) | (df["charges"] > (Q3 + threshold))
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы заменим выбросы на медианное значение
median_charge = df["charges"].median()
df.loc[outliers, "charges"] = 0
df = df[df.charges != 0]
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["age"], df["charges"])
plt.xlabel("Age")
plt.ylabel("Charge")
plt.title("Scatter Plot of Age vs Charge")
plt.show()
Теперь создадим выборки.
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
train_df, temp_df = train_test_split(df, test_size=0.4, random_state=42)
# Разделение остатка на контрольную и тестовую выборки
val_df, test_df = train_test_split(temp_df, test_size=0.5, random_state=42)
# Проверка размеров выборок
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
# Сохранение выборок в файлы
train_df.to_csv(".//static//csv//train_data.csv", index=False)
val_df.to_csv(".//static//csv//val_data.csv", index=False)
test_df.to_csv(".//static//csv//test_data.csv", index=False)
Проанализируем сбалансированность выборок
train_df = pd.read_csv(".//static//csv//train_data.csv")
val_df = pd.read_csv(".//static//csv//val_data.csv")
test_df = pd.read_csv(".//static//csv//test_data.csv")
# Оценка сбалансированности
def check_balance(df, name):
counts = df['sex'].value_counts()
print(f"Распределение Review_type в {name}:")
print(counts)
print(f"Процент мужчин: {counts['male'] / len(df) * 100:.2f}%")
print(f"Процент женщин: {counts['female'] / len(df) * 100:.2f}%")
print()
# Определение необходимости аугментации данных
def need_augmentation(df):
counts = df['sex'].value_counts()
ratio = counts['male'] / counts['female']
if ratio > 1.5 or ratio < 0.67:
print("Необходима аугментация данных для балансировки классов.")
else:
print("Аугментация данных не требуется.")
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
need_augmentation(train_df)
need_augmentation(val_df)
need_augmentation(test_df)
По результатам анализа требуется приращение, соотношения отзывов вне допустимого диапазона
import pandas as pd
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
from sklearn.preprocessing import LabelEncoder
# Загрузка данных
train_df = pd.read_csv(".//static//csv//train_data.csv")
val_df = pd.read_csv(".//static//csv//val_data.csv")
test_df = pd.read_csv(".//static//csv//test_data.csv")
# Преобразование категориальных признаков в числовые
def encode(df):
label_encoders = {}
for column in df.select_dtypes(include=['object']).columns:
if column != 'sex': # Пропускаем целевую переменную
le = LabelEncoder()
df[column] = le.fit_transform(df[column])
label_encoders[column] = le
return label_encoders
# Преобразование целевой переменной в числовые значения
def encode_target(df):
le = LabelEncoder()
df['sex'] = le.fit_transform(df['sex'])
return le
# Применение кодирования
label_encoders = encode(train_df)
encode(val_df)
encode(test_df)
# Кодирование целевой переменной
le_target = encode_target(train_df)
encode_target(val_df)
encode_target(test_df)
# Проверка типов данных
def check_data_types(df):
for column in df.columns:
if df[column].dtype == 'object':
print(f"Столбец '{column}' содержит строковые данные.")
check_data_types(train_df)
check_data_types(val_df)
check_data_types(test_df)
# Функция для выполнения oversampling
def oversample(df):
if 'sex' not in df.columns:
print("Столбец 'sex' отсутствует.")
return df
X = df.drop('sex', axis=1)
y = df['sex']
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([X_resampled, y_resampled], axis=1)
return resampled_df
# Функция для выполнения undersampling
def undersample(df):
if 'sex' not in df.columns:
print("Столбец 'sex' отсутствует.")
return df
X = df.drop('sex', axis=1)
y = df['sex']
undersampler = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = undersampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([X_resampled, y_resampled], axis=1)
return resampled_df
# Применение oversampling и undersampling к каждой выборке
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
train_df_undersampled = undersample(train_df)
val_df_undersampled = undersample(val_df)
test_df_undersampled = undersample(test_df)
# Обратное преобразование целевой переменной в строковые метки
def decode_target(df, le_target):
df['sex'] = le_target.inverse_transform(df['sex'])
decode_target(train_df_oversampled, le_target)
decode_target(val_df_oversampled, le_target)
decode_target(test_df_oversampled, le_target)
decode_target(train_df_undersampled, le_target)
decode_target(val_df_undersampled, le_target)
decode_target(test_df_undersampled, le_target)
# Проверка результатов
def check_balance(df, name):
if 'sex' not in df.columns:
print(f"Столбец 'sex' отсутствует в {name}.")
return
counts = df['sex'].value_counts()
print(f"Распределение sex в {name}:")
print(counts)
if 'male' in counts and 'female' in counts:
print(f"Процент мужчин: {counts['male'] / len(df) * 100:.2f}%")
print(f"Процент женщин: {counts['female'] / len(df) * 100:.2f}%")
else:
print("Отсутствуют один или оба класса (male/female.")
print()
# Проверка сбалансированности после oversampling
print("Оверсэмплинг:")
check_balance(train_df_oversampled, "обучающей выборке")
check_balance(val_df_oversampled, "контрольной выборке")
check_balance(test_df_oversampled, "тестовой выборке")
# Проверка сбалансированности после undersampling
print("Андерсэмплинг:")
check_balance(train_df_undersampled, "обучающей выборке")
check_balance(val_df_undersampled, "контрольной выборке")
check_balance(test_df_undersampled, "тестовой выборке")
Pima Indians Diabetes Database
https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database Датасет диабетов Использование: предугадывание склонности к диабету Входные данные: "Беременности", "Глюкоза", "Кровяное давление", "Толщина кожи", Инсулин, Диабет, Возраст
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//diabetes.csv")
print(df.columns)
Анализируем датафрейм при помощи "ящика с усами". Естьсмещение в сторону меньших значений, это можно исправить при помощи oversampling и undersampling.
import matplotlib.pyplot as plt
import seaborn as sns
# Box plot для столбца 'Popularity'
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Age'])
plt.title('Box Plot для Age')
plt.xlabel('Age')
plt.show()
# Имеется смещение в меньшую сторону
df_cleaned = df.dropna()
plt.figure(figsize=(10, 6))
plt.scatter(df["Age"], df["DiabetesPedigreeFunction"])
plt.xlabel("Age")
plt.ylabel("DiabetesPedigreeFunction")
plt.title("Scatter Plot of Age vs DiabetesPedigreeFunction")
plt.show()
# уберем шумы
# Статистический анализ для определения выбросов
Q1 = df["DiabetesPedigreeFunction"].quantile(0.25)
Q3 = df["DiabetesPedigreeFunction"].quantile(0.75)
IQR = Q3 - Q1
# Определение порога для выбросов
threshold = 1.5 * IQR
outliers = (df["DiabetesPedigreeFunction"] < (Q1 - threshold)) | (
df["DiabetesPedigreeFunction"] > (Q3 + threshold)
)
# Вывод выбросов
print("Выбросы:")
print(df[outliers])
# Обработка выбросов
# В данном случае мы уберем выбросы
median_charge = df["DiabetesPedigreeFunction"].median()
df.loc[outliers, "DiabetesPedigreeFunction"] = 0
df = df[df.DiabetesPedigreeFunction != 0]
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["Age"], df["DiabetesPedigreeFunction"])
plt.xlabel("Age")
plt.ylabel("DiabetesPedigreeFunction")
plt.title("Scatter Plot of Age vs DiabetesPedigreeFunction")
plt.show()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
from sklearn.model_selection import train_test_split
# Разделение на обучающую и тестовую выборки
train_df, test_df = train_test_split(df_cleaned, test_size=0.2, random_state=42)
# Разделение обучающей выборки на обучающую и контрольную
train_df, val_df = train_test_split(train_df, test_size=0.25, random_state=42)
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
Видим недостаток баланса:
def check_balance(df, name):
counts = df['Age'].value_counts()
print(f"Распределение Age в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
Используем oversample
from imblearn.over_sampling import RandomOverSampler
def oversample(df):
X = df.drop('Age', axis=1)
y = df['Age']
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([X_resampled, y_resampled], axis=1)
return resampled_df
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")
Diamonds Prices2022¶
В данном наборе данных представлена цена на алмазы. Входные данные: цвет, вес (в каратах), цена, чистота, габариты. Цель: узнать, насколько дорого обходятся девушкам их друзья (Мэрилин Монро)
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv(".//static//csv//Diamonds Prices2022.csv")
print(df.columns)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['carat'])
plt.title('Box Plot для carat')
plt.xlabel('carat')
plt.show()
import matplotlib.pyplot as plt
import seaborn as sns
# Визуализация данных после обработки
plt.figure(figsize=(10, 6))
plt.scatter(df["price"], df["carat"])
plt.xlabel("price")
plt.ylabel("carat")
plt.title("Scatter Plot of Price vs Carat")
plt.show()
Удаление строк с пустыми значениями
df_cleaned = df.dropna()
Разбиение набора данных на обучающую, контрольную и тестовую выборки
Применение методов приращения данных (аугментации)
from imblearn.over_sampling import RandomOverSampler
from sklearn.model_selection import train_test_split
# Разделение на обучающую и тестовую выборки
train_df, test_df = train_test_split(df_cleaned, test_size=0.2, random_state=42)
# Разделение обучающей выборки на обучающую и контрольную
train_df, val_df = train_test_split(train_df, test_size=0.25, random_state=42)
print("Размер обучающей выборки:", len(train_df))
print("Размер контрольной выборки:", len(val_df))
print("Размер тестовой выборки:", len(test_df))
def check_balance(df, name):
counts = df["price"].value_counts()
print(f"Распределение price в {name}:")
print(counts)
print()
check_balance(train_df, "обучающей выборке")
check_balance(val_df, "контрольной выборке")
check_balance(test_df, "тестовой выборке")
def oversample(df):
X = df.drop("price", axis=1)
y = df["price"]
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([X_resampled, y_resampled], axis=1)
return resampled_df
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")
from imblearn.over_sampling import RandomOverSampler
def oversample(df):
X = df.drop("price", axis=1)
y = df["price"]
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y) # type: ignore
resampled_df = pd.concat([X_resampled, y_resampled], axis=1)
return resampled_df
train_df_oversampled = oversample(train_df)
val_df_oversampled = oversample(val_df)
test_df_oversampled = oversample(test_df)
check_balance(train_df_oversampled, "обучающей выборке после oversampling")
check_balance(val_df_oversampled, "контрольной выборке после oversampling")
check_balance(test_df_oversampled, "тестовой выборке после oversampling")