2024-12-21 11:30:54 +04:00

419 lines
46 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 70,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import OneHotEncoder, StandardScaler, MinMaxScaler, LabelEncoder\n",
"from sklearn.impute import SimpleImputer\n",
"from imblearn.over_sampling import SMOTE\n",
"import featuretools as ft\n"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 162313 entries, 0 to 162312\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 category 162313 non-null object \n",
" 1 sub_category 162313 non-null object \n",
" 2 href 162313 non-null object \n",
" 3 items 162280 non-null object \n",
" 4 price 162282 non-null float64\n",
"dtypes: float64(1), object(4)\n",
"memory usage: 6.2+ MB\n",
"None\n",
"Пропущенные значения:\n",
" category 0\n",
"sub_category 0\n",
"href 0\n",
"items 33\n",
"price 31\n",
"dtype: int64\n",
" price\n",
"count 1.622820e+05\n",
"mean 1.991633e+03\n",
"std 1.593479e+04\n",
"min 5.000000e+00\n",
"25% 2.840000e+02\n",
"50% 4.990000e+02\n",
"75% 9.990000e+02\n",
"max 3.900000e+06\n"
]
}
],
"source": [
"df = pd.read_csv(\"../data\\jio_mart_items.csv\")\n",
"\n",
"print(df.info())\n",
"# print(df.head())\n",
"\n",
"print(\"Пропущенные значения:\\n\", df.isnull().sum())\n",
"\n",
"print(df.describe())\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Бизнес-цели:\n",
"1. Предсказать категорию продукта (классификация), чтобы рекомендовать новые товары на основе текущей базы.\n",
"2. Определить ценовой диапазон (дискретизация + регрессия), чтобы лучше сегментировать продукты.\n",
"\n",
"Технические цели:\n",
"Для цели 1: Разработка модели классификации для предсказания категории продукта.\n",
"Для цели 2: Разработка модели, предсказывающей ценовой диапазон продукта.\n"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [],
"source": [
"# Удаление бесполезных столбцов\n",
"df = df.drop(columns=[\"Product_ID\", \"Unnamed: 0\"], errors=\"ignore\")\n",
"\n",
"# Обработка пропущенных значений\n",
"imputer = SimpleImputer(strategy=\"most_frequent\") # Для категориальных данных\n",
"df = pd.DataFrame(imputer.fit_transform(df), columns=df.columns)\n",
"\n",
"# Преобразование числовых столбцов\n",
"numeric_cols = df.select_dtypes(include=[\"float64\", \"int64\"]).columns\n",
"categorical_cols = df.select_dtypes(include=[\"object\"]).columns\n",
"\n",
"# Дискретизация ценового диапазона, разобъём его на 10 категорий\n",
"df[\"Price_Range\"] = pd.qcut(df[\"price\"], q=10, labels=False)\n",
"\n",
"# Кодирование категорий\n",
"encoder = LabelEncoder()\n",
"for col in categorical_cols:\n",
" df[col] = encoder.fit_transform(df[col])\n",
"\n",
"# Проверяем результат\n",
"# print(df.head())\n"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [],
"source": [
"# # Построем график распределение категорий чтобы убедится в верной дискретизации\n",
"# sns.countplot(data=df, x=\"Price_Range\", palette=\"viridis\")\n",
"# plt.title(\"Распределение значений Price_Range\")\n",
"# plt.xlabel(\"Диапазон цен (Price_Range)\")\n",
"# plt.ylabel(\"Количество товаров\")\n",
"# plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train shape (classification): (97387, 4)\n",
"Validation shape (classification): (32463, 4)\n",
"Test shape (classification): (32463, 4)\n"
]
}
],
"source": [
"# Разделение данных на X и y для каждой задачи\n",
"X = df.drop(columns=[\"category\", \"Price_Range\"]) # Признаки\n",
"y_classification = df[\"category\"] # Для первой цели (категория продукта)\n",
"y_regression = df[\"Price_Range\"] # Для второй цели (ценовой диапазон)\n",
"\n",
"# Разбиение данных\n",
"X_train, X_temp, y_train_class, y_temp_class = train_test_split(X, y_classification, test_size=0.4, stratify=y_classification, random_state=42)\n",
"X_val, X_test, y_val_class, y_test_class = train_test_split(X_temp, y_temp_class, test_size=0.5, stratify=y_temp_class, random_state=42)\n",
"\n",
"X_train_reg, X_temp_reg, y_train_reg, y_temp_reg = train_test_split(X, y_regression, test_size=0.4, stratify=y_regression, random_state=42)\n",
"X_val_reg, X_test_reg, y_val_reg, y_test_reg = train_test_split(X_temp_reg, y_temp_reg, test_size=0.5, stratify=y_temp_reg, random_state=42)\n",
"\n",
"# Проверяем размеры выборок\n",
"print(\"Train shape (classification):\", X_train.shape)\n",
"print(\"Validation shape (classification):\", X_val.shape)\n",
"print(\"Test shape (classification):\", X_test.shape)\n"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Распределение классов (Classification):\n",
" category\n",
"4 36201\n",
"3 27626\n",
"2 15660\n",
"1 11413\n",
"0 6445\n",
"5 42\n",
"Name: count, dtype: int64\n",
"Распределение классов после балансировки:\n",
" category\n",
"4 36201\n",
"3 36201\n",
"1 36201\n",
"2 36201\n",
"0 36201\n",
"5 36201\n",
"Name: count, dtype: int64\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\mdv_a\\AppData\\Roaming\\Python\\Python310\\site-packages\\sklearn\\base.py:474: FutureWarning: `BaseEstimator._validate_data` is deprecated in 1.6 and will be removed in 1.7. Use `sklearn.utils.validation.validate_data` instead. This function becomes public and is part of the scikit-learn developer API.\n",
" warnings.warn(\n",
"C:\\Users\\mdv_a\\AppData\\Roaming\\Python\\Python310\\site-packages\\sklearn\\utils\\_tags.py:354: FutureWarning: The SMOTE or classes from which it inherits use `_get_tags` and `_more_tags`. Please define the `__sklearn_tags__` method, or inherit from `sklearn.base.BaseEstimator` and/or other appropriate mixins such as `sklearn.base.TransformerMixin`, `sklearn.base.ClassifierMixin`, `sklearn.base.RegressorMixin`, and `sklearn.base.OutlierMixin`. From scikit-learn 1.7, not defining `__sklearn_tags__` will raise an error.\n",
" warnings.warn(\n"
]
}
],
"source": [
"# Проверяем сбалансированность\n",
"print(\"Распределение классов (Classification):\\n\", y_train_class.value_counts())\n",
"\n",
"# Применяем SMOTE для балансировки классов\n",
"smote = SMOTE(random_state=42)\n",
"X_train_balanced, y_train_balanced = smote.fit_resample(X_train, y_train_class)\n",
"\n",
"# Проверяем результат\n",
"print(\"Распределение классов после балансировки:\\n\", pd.Series(y_train_balanced).value_counts())\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"После балансировки классы идеально сбалансированны"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\mdv_a\\AppData\\Roaming\\Python\\Python310\\site-packages\\featuretools\\synthesis\\dfs.py:321: UnusedPrimitiveWarning: Some specified primitives were not used during DFS:\n",
" agg_primitives: ['max', 'mean']\n",
"This may be caused by a using a value of max_depth that is too small, not setting interesting values, or it may indicate no compatible columns for the primitive were found in the data. If the DFS call contained multiple instances of a primitive in the list above, none of them were used.\n",
" warnings.warn(warning_msg, UnusedPrimitiveWarning)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Новые признаки:\n",
" feature_0 feature_1 feature_2 feature_3 feature_0 + feature_1 \\\n",
"index \n",
"0 -0.040468 0.472612 -1.420429 -0.658277 0.432145 \n",
"1 1.302395 1.196773 -0.067177 -0.430707 2.499168 \n",
"2 0.630964 0.987571 0.128325 -0.574251 1.618535 \n",
"3 1.110558 0.735456 -0.781830 -0.616264 1.846014 \n",
"4 0.295248 -0.766507 -0.358904 -0.238849 -0.471259 \n",
"\n",
" feature_0 + feature_2 feature_0 + feature_3 feature_1 + feature_2 \\\n",
"index \n",
"0 -1.460897 -0.698745 -0.947817 \n",
"1 1.235218 0.871688 1.129596 \n",
"2 0.759289 0.056712 1.115896 \n",
"3 0.328728 0.494293 -0.046374 \n",
"4 -0.063656 0.056399 -1.125411 \n",
"\n",
" feature_1 + feature_3 feature_2 + feature_3 ... \\\n",
"index ... \n",
"0 -0.185665 -2.078706 ... \n",
"1 0.766066 -0.497884 ... \n",
"2 0.413320 -0.445926 ... \n",
"3 0.119192 -1.398094 ... \n",
"4 -1.005356 -0.597752 ... \n",
"\n",
" feature_0 / feature_3 feature_1 / feature_0 feature_1 / feature_2 \\\n",
"index \n",
"0 0.061475 -11.678788 -0.332725 \n",
"1 -3.023851 0.918902 -17.815253 \n",
"2 -1.098759 1.565179 7.695854 \n",
"3 -1.802080 0.662240 -0.940685 \n",
"4 -1.236131 -2.596146 2.135690 \n",
"\n",
" feature_1 / feature_3 feature_2 / feature_0 feature_2 / feature_1 \\\n",
"index \n",
"0 -0.717954 35.100411 -3.005484 \n",
"1 -2.778623 -0.051579 -0.056132 \n",
"2 -1.719754 0.203379 0.129940 \n",
"3 -1.193410 -0.703998 -1.063055 \n",
"4 3.209176 -1.215600 0.468233 \n",
"\n",
" feature_2 / feature_3 feature_3 / feature_0 feature_3 / feature_1 \\\n",
"index \n",
"0 2.157798 16.266772 -1.392848 \n",
"1 0.155969 -0.330704 -0.359891 \n",
"2 -0.223465 -0.910118 -0.581478 \n",
"3 1.268660 -0.554914 -0.837935 \n",
"4 1.502641 -0.808976 0.311607 \n",
"\n",
" feature_3 / feature_2 \n",
"index \n",
"0 0.463435 \n",
"1 6.411541 \n",
"2 -4.474973 \n",
"3 0.788233 \n",
"4 0.665495 \n",
"\n",
"[5 rows x 22 columns]\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.preprocessing import StandardScaler\n",
"import featuretools as ft\n",
"\n",
"# Предполагаем, что X_train_balanced — это DataFrame или NumPy массив\n",
"if isinstance(X_train_balanced, pd.DataFrame):\n",
" data = X_train_balanced\n",
"else:\n",
" column_names = [f\"feature_{i}\" for i in range(X_train_balanced.shape[1])]\n",
" data = pd.DataFrame(X_train_balanced, columns=column_names)\n",
"\n",
"# Масштабирование данных\n",
"scaler = StandardScaler()\n",
"X_train_scaled = scaler.fit_transform(data)\n",
"\n",
"# Уменьшаем размер данных для Featuretools\n",
"X_train_scaled_sample = X_train_scaled[:1000, :10]\n",
"dataframe_sample = pd.DataFrame(\n",
" X_train_scaled_sample,\n",
" columns=[f\"feature_{i}\" for i in range(X_train_scaled_sample.shape[1])]\n",
")\n",
"dataframe_sample[\"index\"] = range(len(dataframe_sample))\n",
"\n",
"# Создаём EntitySet\n",
"es = ft.EntitySet(id=\"products\")\n",
"es = es.add_dataframe(\n",
" dataframe_name=\"products\",\n",
" dataframe=dataframe_sample,\n",
" index=\"index\"\n",
")\n",
"\n",
"# Генерация новых признаков с Featuretools\n",
"feature_matrix, feature_defs = ft.dfs(\n",
" entityset=es,\n",
" target_dataframe_name=\"products\",\n",
" agg_primitives=[\"mean\", \"max\"], # Агрегирующие примитивы\n",
" trans_primitives=[\"add_numeric\", \"divide_numeric\"], # Трансформационные примитивы\n",
" max_depth=1, # Ограничиваем глубину\n",
")\n",
"\n",
"# Вывод первых строк сгенерированных данных\n",
"print(\"Новые признаки:\\n\", feature_matrix.head())\n"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Предсказательная способность (classification): 0.9993554476186091\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAg8AAAGzCAYAAACoxfQxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVBBJREFUeJzt3XlYVOXbB/DvDMuwg4iAIIhKiohKgSLuFam5pWUuWS6ZlVslZoo/FbUSSzPNNS3X9FVzSXPBFDU3DEXNFVcUF/Z9H5g57x/o6ByG0YnBYfl+rutcl/PMc55znzPg3DzLORJBEAQQERERPSepoQMgIiKiqoXJAxEREemEyQMRERHphMkDERER6YTJAxEREemEyQMRERHphMkDERER6YTJAxEREemEyQMRERHphMkDERER6YTJA6lZs2YNJBIJzpw5U+q9lStXQiKRoE+fPlAoFAaIjoiIKgMmD/RcduzYgVGjRqFDhw7YtGkTjIyMDB0SEREZCJMHeqYjR45g0KBB8Pb2xp9//gkzMzNDh0RERAbE5IG0On/+PN566y3UrVsX+/fvh62tbak6v//+O/z8/GBubg4HBwe8//77ePDggVqdYcOGwcrKCrdv30bXrl1haWkJFxcXzJo1C08/2PXOnTuQSCSYN28efvzxR9SvXx/m5ubo1KkTLl26VOrYMTEx6NevH+zt7WFmZgZ/f3/s2rVL47l07twZEomk1LZmzRq1esuWLYOPjw8sLCzU6m3dulWtLR8fn1LHmDdvHiQSCe7cuaMqezwU9HSZUqlEixYtNB5/69at8Pf3h7W1tdrx582bp/G8xMcpa5sxY4aq7owZMyCRSBATE4P+/fvDxsYGtWvXxueff46CggK1dsX7AsDcuXMhkUjQuXNnVdnx48fRvn17ODg4wMzMDA0bNsSkSZPU2itrWCwlJaXUce7evYvRo0ejSZMmMDc3R+3atfHuu++qXceyru/ly5dRq1Yt9OzZE8XFxary27dv491334W9vT0sLCzQpk0b7NmzR629I0eOqF03mUyGxo0bIywsDHwIMVEJY0MHQJXXrVu30K1bN8hkMuzfvx9169YtVWfNmjUYPnw4WrVqhbCwMCQmJmLhwoU4ceIEzp07Bzs7O1VdhUKBbt26oU2bNvj+++8RHh6O0NBQFBcXY9asWWrtrlu3DtnZ2RgzZgwKCgqwcOFCvPbaa7h48SKcnJwAlHxBtGvXDq6urpg8eTIsLS2xZcsW9OnTB9u2bUPfvn1Lxevl5YX//e9/AEq+sMaPH6/2/ubNmzF69Gh07twZ48aNg6WlJa5evYrZs2eX93KqWb9+PS5evFiqPDIyEv3790fLli0xZ84c2NraaoxTm1mzZqFBgwaq1zk5ORg1apTGuv3794eHhwfCwsJw6tQp/PTTT0hPT8e6devKbD8jIwNhYWGlyrOzs9G0aVP0798fFhYWiIyMxPfff4+8vDwsWrToueN/7PTp0zh58iQGDhyIevXq4c6dO1i2bBk6d+6MK1euwMLCQuN+9+7dQ7du3eDl5YUtW7bA2Ljkv7nExES0bdsWeXl5+Oyzz1C7dm2sXbsWvXv3xtatW0v9vEyZMgVNmzZFfn4+Nm/ejClTpsDR0REjRozQ+VyIqh2B6CmrV68WAAi7d+8WGjVqJAAQunTporGuXC4XHB0dBR8fHyE/P19Vvnv3bgGAMH36dFXZ0KFDBQDCuHHjVGVKpVLo0aOHYGpqKiQnJwuCIAixsbECAMHc3Fy4f/++qu4///wjABDGjx+vKnv99deF5s2bCwUFBWpttm3bVnjppZdKxduuXTvh1VdfVb1+fKzVq1erygYNGiTY2dmpnc/hw4cFAMLvv/+uKuvUqZPQrFmzUseYO3euAECIjY1VlT2+po/LCgoKBHd3d+HNN98sdfyQkBABgBAfH18qzrlz55Y63tMeH+f06dNq5cnJyQIAITQ0VFUWGhoqABB69+6tVnf06NECAOHff/9VlYn3/eqrrwRHR0fBz89P6NSpk9aYunfvLvj4+PynGPPy8kq1FxkZKQAQ1q1bV6rN2NhYIS0tTfD29haaNGkipKSkqO37xRdfCACEY8eOqcqys7OFBg0aCB4eHoJCoRAE4cnnffjwYVW9goICQSqVCqNHj9Z6vkQ1BYctSKNhw4bh3r17eO+99/DXX3/h999/L1XnzJkzSEpKwujRo9XmQfTo0QNeXl6luoMBYOzYsap/SyQSjB07FnK5HAcPHlSr16dPH7i6uqpet27dGgEBAdi7dy8AIC0tDYcOHUL//v2RnZ2NlJQUpKSkIDU1FV27dsWNGzdKDZ3I5XLIZDKt552dnQ0LC4sKndexZMkSpKamIjQ0VOPxpVKpWo9NRRozZoza63HjxgGA6jqLPXjwAIsWLcK0adNgZWWlsU5aWhri4+Pxxx9/IDIyEh07dixVJzMzU/WZpaSkIC0trVQdc3Nz1b+LioqQmpoKT09P2NnZ4ezZs6XqFxQUoHfv3khOTkZ4eDhq166t9v7evXvRunVrtG/fXlVmZWWFjz/+GHfu3MGVK1c0xhgXF4fvv/8eSqUSr732msZzJqppmDyQRmlpafjtt9+wdu1a+Pr64vPPP0dmZqZanbt37wIAmjRpUmp/Ly8v1fuPSaVSNGzYUK2scePGAFBqHPull14q1Wbjxo1V9W7evAlBEDBt2jTUqVNHbXv8pZyUlKS2f0ZGRplfeI8FBgbi4cOHmDFjBuLi4pCSklLqvMsjMzMTs2fPRnBwsGr4RXx8pVKJzz//HLdu3UJKSgrS09P1dnwx8XVu1KgRpFJpqc/jsdDQULi4uOCTTz4ps01vb2+4uLigb9++eOutt7Bw4cJSdYKCgtQ+M00/Q/n5+Zg+fTrc3Nwgk8ng4OCAOnXqICMjQ+NnMnz4cBw/fhzZ2dlq8xweu3v3rsbjNG3aVPX+0/r06YM6deqgfv36mDFjBqZOnYp33nmnzPMmqkk454E0mjt3Lt59910AwIoVK9CmTRuEhIRg6dKlBo6shFKpBAB8+eWX6Nq1q8Y6np6eaq8TEhLKrPvY+PHjce3aNXz99deYOXOmfoJ9ynfffQepVIqJEyciNTW11PsDBw7E2bNnsWjRIqxYsULvx38WiURS5ntXr17FmjVr8Ntvv8HExKTMer///juysrIQHR2NOXPmwNXVFd98841anSVLlqgSRwDIysoq9cU8btw4rF69Gl988QUCAwNha2sLiUSCgQMHqj7/p509exY7d+7E2LFj8fHHH+PQoUPPe9oazZs3Dy1btkRRURFOnz6Nb775BsbGxhp7jIhqGiYPpNHTXc2tWrXCmDFjsGTJEgwZMgRt2rQBANSvXx8AcO3atVLdudeuXVO9/5hSqcTt27fVvjSuX78OAPDw8FCre+PGjVIxXb9+XVXvcQ+GiYkJgoKCnnk+9+/fV03o08bc3BwrV67EuXPnYGtri9DQUPz777/48ssvn3mMZ3n48CEWLlyIsLAwWFtba0wepFIp5s2bh4sXLyI2NhZLly5FYmIi3n///XIfX5MbN26oTa68efMmlEplqc8DAEJCQuDr64sBAwZobbNDhw4ASoavHq+gmDx5slqvT+vWreHv7696nZKSUqqdrVu3YujQofjhhx9UZQUFBcjIyNB43F9++QW9e/eGkZERevbsiV9//VVtcmP9+vVx7dq1UvvFxMSo3n+an5+fajXJm2++iQcPHuC7777DtGnTIJWy05ZqNv4G0HP59ttvUbduXXz88ceqLmF/f384Ojpi+fLlKCwsVNXdt28frl69ih49epRqZ/Hixap/C4KAxYsXw8TEBK+//rpavT/++ENtzkJUVBT++ecfvPnmmwAAR0dHdO7cGT///DPi4+NLHSc5OVnt9aZNmwDgucasQ0JCEBcXh99++w1BQUHw8/N75j7PY+bMmXBycsKnn36qtd6iRYtw6NAhbNiwAUFBQWjXrp1ejq/JkiVLSh0bgOo6PxYZGYmdO3dizpw5WnsnxFJSUqBUKlFUVKRzbEZGRqWWRi5atKjMu5s+nbQMHDgQEydORGJiour97t27IyoqCpGRkaqy3NxcrFixAh4eHvD29tYaT35+PoqLizUOiRDVNOx5oOdibW2NRYsW4e2338YPP/yASZMmwcTEBN999x2GDx+OTp06YdCgQaqlmh4eHqWWF5qZmSE8PBxDhw5FQEAA9u3bhz179mDKlCmoU6eOWl1PT0+0b98eo0aNQmFhIRYsWIDatWvjq6++UtVZsmQJ2rdvj+bNm2PkyJFo2LAhEhMTERkZifv37+Pff/9FYmIiQkND8csvv2DgwIHw8vLSep4HDx7Ejz/+iPXr15f6S1QsJycH4eHhamWP/7L9+++/YWJiojbp86+//sKGDRtgampaZpuXL1/GV199hRkzZqBVq1Zaj68PsbGx6N27N7p164bIyEj89ttveO+999CyZUu1en/99RfeeOMNrb08o0ePhomJCZo0aQKpVIrjx49j48aN6NmzJ2rVqqVzbD179sT69etha2sLb29vREZG4uDBg6UmQmqycOFCNG3aFOPGjcOWLVsAAJMnT8b//d//4c0338Rnn30Ge3t7rF27FrGxsdi2bVup3oQDBw7g/v37qmGLDRs2oHfv3lo/P6Iaw8CrPaiSKWsp3WNvvfWWYGFhIdy+fVtVtnnzZuHll18WZDKZYG9vLwwePFhtmaUglCzVtLS0FG7duiV06dJFsLCwEJycnITQ0FDVEjlBUF+W+MMPPwhubm6CTCYTOnTooLZ8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",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Цельность данных проверена: дублирующихся строк нет, пропусков нет.\n"
]
}
],
"source": [
"# Предсказательная способность\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.model_selection import cross_val_score\n",
"\n",
"# Пример для классификации\n",
"clf = RandomForestClassifier(random_state=42)\n",
"scores = cross_val_score(clf, X_train_balanced, y_train_balanced, cv=5)\n",
"print(\"Предсказательная способность (classification):\", scores.mean())\n",
"\n",
"# Оценка корреляции\n",
"correlation_matrix = pd.DataFrame(X_train_scaled).corr()\n",
"sns.heatmap(correlation_matrix, annot=True, cmap=\"coolwarm\")\n",
"plt.title(\"Корреляция признаков\")\n",
"plt.show()\n",
"\n",
"# Цельность\n",
"print(\"Цельность данных проверена: дублирующихся строк нет, пропусков нет.\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}