153 KiB
Выбранные темы: цены на кофе, магазины, оценки студентов Далее идут выбранные таблицы
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
label_encoder = LabelEncoder()
# Функция для применения oversampling
def apply_oversampling(X, y):
oversampler = RandomOverSampler(random_state=42)
X_resampled, y_resampled = oversampler.fit_resample(X, y)
return X_resampled, y_resampled
# Функция для применения undersampling
def apply_undersampling(X, y):
undersampler = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = undersampler.fit_resample(X, y)
return X_resampled, y_resampled
def split_stratified_into_train_val_test(
df_input,
stratify_colname="y",
frac_train=0.6,
frac_val=0.15,
frac_test=0.25,
random_state=None,
):
"""
Splits a Pandas dataframe into three subsets (train, val, and test)
following fractional ratios provided by the user, where each subset is
stratified by the values in a specific column (that is, each subset has
the same relative frequency of the values in the column). It performs this
splitting by running train_test_split() twice.
Parameters
----------
df_input : Pandas dataframe
Input dataframe to be split.
stratify_colname : str
The name of the column that will be used for stratification. Usually
this column would be for the label.
frac_train : float
frac_val : float
frac_test : float
The ratios with which the dataframe will be split into train, val, and
test data. The values should be expressed as float fractions and should
sum to 1.0.
random_state : int, None, or RandomStateInstance
Value to be passed to train_test_split().
Returns
-------
df_train, df_val, df_test :
Dataframes containing the three splits.
"""
if frac_train + frac_val + frac_test != 1.0:
raise ValueError(
"fractions %f, %f, %f do not add up to 1.0"
% (frac_train, frac_val, frac_test)
)
if stratify_colname not in df_input.columns:
raise ValueError("%s is not a column in the dataframe" % (stratify_colname))
X = df_input # Contains all columns.
y = df_input[
[stratify_colname]
] # Dataframe of just the column on which to stratify.
# Split original dataframe into train and temp dataframes.
df_train, df_temp, y_train, y_temp = train_test_split(
X, y, stratify=y, test_size=(1.0 - frac_train), random_state=random_state
)
# Split the temp dataframe into val and test dataframes.
relative_frac_test = frac_test / (frac_val + frac_test)
df_val, df_test, y_val, y_test = train_test_split(
df_temp,
y_temp,
stratify=y_temp,
test_size=relative_frac_test,
random_state=random_state,
)
assert len(df_input) == len(df_train) + len(df_val) + len(df_test)
return df_train, df_val, df_test
Отслеживание цен на акции Старбакс. Объекты связаны между собой датой, т.е. каждая следующая строка это новый день. Можно узнать как, относительно изменения цен на акции, идут продажи акций. Поможет для трейдинговых компаний. Целевым признаком является количество покупающих.
df1 = pd.read_csv("../data/coffee.csv")
df1.info()
print(df1.isnull().sum())
print(df1.describe())
print()
print(df1["Date"].value_counts().unique())
print()
plt.plot(df1["Date"], df1["High"])
plt.show()
Данные по всем параметрам являются правильными, без шумов, без выбросов, актуальными.
Магазины. Каждая строка представляет собой магазин, его площадь, количество продуктов, количество покупателей и объем продаж. Позволяет увидеть изменения количества продаж относительно размеров магазина и количества покупателей. Ключевой признак - количество продаж
df2 = pd.read_csv("../data/store.csv")
df2.info()
print(df2.isnull().sum())
print(df2.describe())
print()
plt.scatter(df2["Store_Sales"], df2["Daily_Customer_Count"])
plt.show()
Данные имеют некоторое количество выбросов, что видно на графике.
Оценки студентов. Показывает оценки конкретного студента. Аналитика относительно гендера, расы, уровня образования родителей. Поможет для онлайн-школ для опредения контенгента покупателей курсов. Ключевыми значениями являются оценки по предметам.
df3 = pd.read_csv("../data/student.csv")
df3.info()
df3["score"] = (df3["math score"] + df3["reading score"] + df3["writing score"]) / 3
print(df3.head())
print(df3.isnull().sum())
print(df3.describe())
print()
plt.scatter(df3["score"], df3["parental level of education"])
plt.show()
Для всех выбранных тем отсутствуют пустые ячейки. Заполнение пустых ячеек не требуется. Данные вполне реальные.
Разбиение наборов на выборки.
Акции старбакс.
data = df1[["Volume", "High", "Low"]].copy()
data["Volume_Grouped"] = pd.cut(data["Volume"], bins=50, labels=False)
interval_counts = data["Volume_Grouped"].value_counts().sort_index()
min_samples_per_interval = 5
for interval, count in interval_counts.items():
if count < min_samples_per_interval:
data.loc[data["Volume_Grouped"] == interval, "Volume_Grouped"] = -1
df_coffee_train, df_coffee_val, df_coffee_test = split_stratified_into_train_val_test(
data, stratify_colname="Volume_Grouped", frac_train=0.60, frac_val=0.20, frac_test=0.20)
print("Обучающая выборка: ", df_coffee_train.shape)
print(df_coffee_train["Volume_Grouped"].value_counts())
X_resampled, y_resampled = ada.fit_resample(df_coffee_train, df_coffee_train["Volume_Grouped"])
df_coffee_train_adasyn = pd.DataFrame(X_resampled)
print("Обучающая выборка после oversampling: ", df_coffee_train_adasyn.shape)
print(df_coffee_train_adasyn.Pclass.value_counts())
print("Контрольная выборка: ", df_coffee_val.shape)
print(df_coffee_val["Volume_Grouped"].value_counts())
print("Тестовая выборка: ", df_coffee_test.shape)
print(df_coffee_test["Volume_Grouped"].value_counts())
Магазины
data = df2[["Store_Sales", "Store_Area", "Daily_Customer_Count"]].copy()
data["Sales_Grouped"] = pd.cut(data["Store_Sales"], bins=6, labels=False)
interval_counts = data["Sales_Grouped"].value_counts().sort_index()
min_samples_per_interval = 10
for interval, count in interval_counts.items():
if count < min_samples_per_interval:
data.loc[data["Sales_Grouped"] == interval, "Sales_Grouped"] = -1
df_shop_train, df_shop_val, df_shop_test = split_stratified_into_train_val_test(
data, stratify_colname="Sales_Grouped", frac_train=0.60, frac_val=0.20, frac_test=0.20)
print("Обучающая выборка: ", df_shop_train.shape)
print(df_shop_train["Sales_Grouped"].value_counts())
X_resampled, y_resampled = ada.fit_resample(df_mark_train, df_mark_train["score_grouped"])
df_mark_train_adasyn = pd.DataFrame(X_resampled)
print("Обучающая выборка после oversampling: ", df_mark_train_adasyn.shape)
print(df_mark_train_adasyn.Pclass.value_counts())
print("Контрольная выборка: ", df_shop_val.shape)
print(df_shop_val["Sales_Grouped"].value_counts())
print("Тестовая выборка: ", df_shop_test.shape)
print(df_shop_test["Sales_Grouped"].value_counts())
Оценки студентов
data = df3[["score", "gender", "race/ethnicity"]].copy()
data["score_grouped"] = pd.cut(data["score"], bins=5, labels=False)
data["gender"] = label_encoder.fit_transform(data['gender'])
data["race/ethnicity"] = label_encoder.fit_transform(data['race/ethnicity'])
interval_counts = data["score_grouped"].value_counts().sort_index()
min_samples_per_interval = 10
for interval, count in interval_counts.items():
if count < min_samples_per_interval:
data.loc[data["score_grouped"] == interval, "score_grouped"] = -1
df_mark_train, df_mark_val, df_mark_test = split_stratified_into_train_val_test(
data, stratify_colname="score_grouped", frac_train=0.60, frac_val=0.20, frac_test=0.20)
print("Обучающая выборка: ", df_mark_train.shape)
print(df_mark_train["score_grouped"].value_counts())
X_resampled, y_resampled = ada.fit_resample(df_mark_train, df_mark_train["score_grouped"])
df_mark_train_adasyn = pd.DataFrame(X_resampled)
print("Обучающая выборка после oversampling: ", df_mark_train_adasyn.shape)
print(df_mark_train_adasyn.Pclass.value_counts())
print("Контрольная выборка: ", df_mark_val.shape)
print(df_mark_val["score_grouped"].value_counts())
print("Тестовая выборка: ", df_mark_test.shape)
print(df_mark_test["score_grouped"].value_counts())