правки

This commit is contained in:
Aleksandr Izotov 2024-10-31 04:19:52 +04:00
parent 2d7dc8e8cf
commit 089b3add84

View File

@ -4,9 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## **Лабораторная работа №2**\n",
"\n",
"Загрузка и анализ трёх датасетов"
"## **Лабораторная работа №2**"
]
},
{
@ -338,19 +336,21 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"В ходе проверки на "
"В результате проверки на пустые строки и значения мы видим, что таковых не обнаружено "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проверим датасет по числовым данным, для выявления аномальных распределений"
"### **Проверка набора данных на аномальные распределения**\n",
"\n",
"Проверим датасет по числовым данным, для выявления аномальных распределений "
]
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 44,
"metadata": {},
"outputs": [
{
@ -407,12 +407,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Аномальное рапределение будем искать по z-индексую. Z-индекс показывает, насколько далеко значение находится от среднего в стандартных отклонениях. Значения Z-индекса больше 3 или меньше -3 обычно считаются аномальными."
"Здесь можно определить, что в некоторых областях присутствует аномальное распределение. Следовательно аномальное рапределение будем искать по z-индексу. Он показывает нам, насколько далеко значение находится от среднего в стандартных отклонениях. Значения Z-индекса больше 3 или меньше -3 обычно считаются аномальными."
]
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 45,
"metadata": {},
"outputs": [
{
@ -443,18 +443,16 @@
"df2_zscores = df2.select_dtypes(include=['float64', 'int64']).apply(stats.zscore, nan_policy='omit')\n",
"df3_zscores = df3.select_dtypes(include=['float64', 'int64']).apply(stats.zscore, nan_policy='omit')\n",
"\n",
"# Устанавливаем порог для поиска аномалий\n",
"# Порог для поиска аномалий\n",
"threshold = 3\n",
"\n",
"# Функция для нахождения аномалий и вывода сообщения\n",
"def find_anomalies(zscores, data):\n",
" for column in zscores.columns:\n",
" # Проверяем, есть ли аномалии в Z-индексах\n",
" # Проверка на присутствие аномалии \n",
" anomalies = data[column][(zscores[column].abs() > threshold)]\n",
" if not anomalies.empty:\n",
" print(f\"В атрибуте '{column}' обнаружены аномалии: {anomalies.tolist()}\")\n",
"\n",
"# Находим аномалии\n",
"try:\n",
" print(\"Аномалии в наборе данных Diamonds Prices:\")\n",
" find_anomalies(df_zscores, df)\n",
@ -473,12 +471,14 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Теперь выполним 10 пункт, разобьем данные на выборки"
"### **Разбиение набора данных на выборки**\n",
"\n",
"Следующим этапом разбиваем набор данных на выборки. Прежде всего стоит избавиться от большого количества уникальных значений в столбцах с целевыми признаками. Для этого добавим новый столбец в датасет Forbes Billionaires с малым количеством значений."
]
},
{
"cell_type": "code",
"execution_count": 33,
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
@ -487,7 +487,7 @@
},
{
"cell_type": "code",
"execution_count": 34,
"execution_count": 47,
"metadata": {},
"outputs": [
{
@ -582,13 +582,13 @@
" \n",
" return X_train, X_val, X_test, y_train, y_val, y_test\n",
"\n",
"# Для набора данных neo\n",
"# Для набора данных Diamonds Prices\n",
"df_train, df_val, df_test, df_train_labels, df_val_labels, df_test_labels = split_data(df, 'cut')\n",
"\n",
"# Для набора данных healthcare\n",
"# Для набора данных Forbes Billionaires\n",
"df2_train, df2_val, df2_test, df2_train_labels, df2_val_labels, df2_test_labels = split_data(df2, 'networth_segment')\n",
"\n",
"# Для набора данных diabetes\n",
"# Для набора данных Tesla\n",
"df3_train, df3_val, df3_test, df3_train_labels, df3_val_labels, df3_test_labels = split_data(df3, 'Transaction')\n",
"def check_balance(y_train, y_val, y_test):\n",
" print(\"Обучающая выборка:\")\n",
@ -612,12 +612,38 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Приращение методами выборки с избытком (oversampling) и выборки с недостатком (undersampling)"
"#### **Набор данных Diamonds Prices**\n",
"- Пропорция классов в обучающей выборке довольно сбалансирована, хотя класс Ideal составляет 39.95%, что значительно больше, чем у остальных классов. Остальные классы представлены следующим образом: Premium (25.57%), Very Good (22.40%), Good (9.10%) и Fair (2.98%).\n",
"\n",
"- Если модель будет обучаться только на этих данных, она может показать высокую точность, просто предсказывая, что большинство объектов относятся к классу Ideal, что может привести к снижению её способности определять менее представленные классы, такие как Fair.\n",
"\n",
"#### **Набор данных Forbes Billionaires**\n",
"- Пропорция классов в этом наборе данных крайне несбалансирована: Ultra High Networth составляет 92.45%, в то время как High Networth и Medium Networth составляют лишь 7.02% и 0.53% соответственно.\n",
"\n",
"- В случае обучения модели на этих данных, она может иметь высокую точность, просто предсказывая, что все объекты принадлежат классу Ultra High Networth. Это негативно скажется на способности модели правильно классифицировать более редкие классы, такие как Medium Networth.\n",
"\n",
"#### **Набор данных Tesla**\n",
"- Пропорция классов в обучающей выборке менее выражена, чем в предыдущих примерах, но все же классы не являются полностью сбалансированными: класс Sale составляет 63.71%, а класс Option Exercise — 36.29%.\n",
"\n",
"- Модель может научиться распознавать оба класса, однако если точность по классу Option Exercise будет низкой, стоит рассмотреть применение методов аугментации данных или выборки для улучшения её производительности на этом классе."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### **Приращение наборов данных**\n",
"\n",
"Заключительным этапом проводим приращение наборов данных методами выборки с избытком **(oversampling)** и выборки с недостатком **(undersampling)**\n",
"\n",
"- **Oversampling (приращение данных):** Увеличение числа примеров для меньшинства классов.\n",
"\n",
"- **Undersampling (уменьшение данных):** Уменьшение числа примеров для большинства классов."
]
},
{
"cell_type": "code",
"execution_count": 43,
"execution_count": 48,
"metadata": {},
"outputs": [
{
@ -652,11 +678,10 @@
"from imblearn.over_sampling import RandomOverSampler\n",
"from imblearn.under_sampling import RandomUnderSampler\n",
"\n",
"# Пример Oversampling для Diamonds Prices\n",
"# Oversampling для Diamonds Prices\n",
"X_df = df.drop('cut', axis=1) \n",
"y_df = df['cut'] \n",
"\n",
"# Oversampling\n",
"ros_df = RandomOverSampler(random_state=42)\n",
"X_df_resampled, y_df_resampled = ros_df.fit_resample(X_df, y_df)\n",
"df_resampled = pd.DataFrame(X_df_resampled, columns=X_df.columns)\n",
@ -669,7 +694,7 @@
"X_df2 = df2.drop('networth_segment', axis=1)\n",
"y_df2 = df2['networth_segment']\n",
"\n",
"# Пример Undersampling для Forbes Billionaires\n",
"# Undersampling для Forbes Billionaires\n",
"rus_df2 = RandomUnderSampler(random_state=42)\n",
"X_df2_resampled_under, y_df2_resampled_under = rus_df2.fit_resample(X_df2, y_df2)\n",
"df2_resampled_under = pd.DataFrame(X_df2_resampled_under, columns=X_df2.columns)\n",
@ -678,11 +703,10 @@
"print(\"\\nUndersampling для Forbes Billionaires:\")\n",
"print(df2_resampled_under['networth_segment'].value_counts())\n",
"\n",
"# Пример Oversampling для Tesla\n",
"# Oversampling для Tesla\n",
"X_df3 = df3.drop('Transaction', axis=1)\n",
"y_df3 = df3['Transaction']\n",
"\n",
"# Oversampling\n",
"ros_df3 = RandomOverSampler(random_state=42)\n",
"X_df3_resampled, y_df3_resampled = ros_df3.fit_resample(X_df3, y_df3)\n",
"df3_resampled = pd.DataFrame(X_df3_resampled, columns=X_df3.columns)\n",