Похожие презентации:
Практика 4
1. Практика. EDA. Классификация. Регрессия
2. Импорты
import pandas as pdimport numpy as np
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import OneHotEncoder
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import classification_report, confusion_matrix,
accuracy_score, r2_score
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
import joblib
3. EDA
4. Загрузка данных
file_path = '/content/bank.csv'df = pd.read_csv(file_path, sep=';')
5. Обзор структуры и типов
print("=== Размерность ===")print(df.shape)
6. Обзор структуры и типов
print("\n=== Первые 5 строк ===")print(df.head())
7. Обзор структуры и типов
print("\n=== Типы данных ===")print(df.dtypes)
8. Обзор структуры и типов
age Возраст
job Профессия / Занятость
marital Семейное положение
education Образование
default Имеет ли дефолт по кредиту (да/нет)
balance Баланс на счете (в евро)
housing Имеет ли ипотеку (да/нет)
loan Имеет ли потребительский кредит (да/нет)
contact Тип контакта (например, мобильный телефон)
day День месяца, когда был контакт
month Месяц, когда был контакт
duration Продолжительность последнего контакта (в секундах)
campaign Количество контактов в текущей кампании для этого клиента
pdays Количество дней, прошедших с последнего контакта по предыдущей кампании (-1 — не контактировали)
previous Количество контактов по предыдущим кампаниям
poutcome Результат предыдущей маркетинговой кампании (например, «успех», «неудача»)
y Целевая переменная: подписал ли клиент депозит («yes»/«no»)
9. Проверка пропусков
print("\n=== Пропущенные значения ===")print(df.isnull().sum())
10. Проверка пропусков
print("\n=== Уникальные значения в каждойколонке ===")
for col in df.columns:
print(f"{col}: {df[col].nunique()}
уникальных значений")
11. Статистика по категориальным и числовым признака
print("\n=== Описательная статистика (числовыепризнаки) ===")
print(df.describe())
12. Статистика по категориальным и числовым признака
print("\n=== Распределение категориальныхпризнаков (примеры) ===")
categorical_cols =
df.select_dtypes(include=['object']).columns
for col in categorical_cols[:5]: # покажем
первые 5
print(f"\n{col}:\n{df[col].value_counts()}")
13. Статистика по категориальным и числовым признака
print("\n=== Распределение целевой переменной 'y'===")
print(df['y'].value_counts())
print(df['y'].value_counts(normalize=True))
# Визуализация целевой переменной
plt.figure(figsize=(6, 4))
sns.countplot(data=df, x='y')
plt.title('Распределение целевой переменной (y)')
plt.show()
14. Визуализация распределений и зависимостей
numeric_cols =df.select_dtypes(include=[np.number]).columns
df[numeric_cols].hist(bins=20, figsize=(14, 10),
edgecolor='black')
plt.suptitle('Гистограммы числовых признаков')
plt.tight_layout()
plt.show()
15. Визуализация распределений и зависимостей
plt.figure(figsize=(10, 8))corr = df[numeric_cols].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm',
fmt=".2f")
plt.title('Корреляция числовых признаков')
plt.show()
16. Визуализация распределений и зависимостей
fig, axes = plt.subplots(3, 3, figsize=(18, 15))axes = axes.ravel()
cat_cols_for_plot = [col for col in categorical_cols if
col != 'y'][:9] # первые 9 категориальных
for i, col in enumerate(cat_cols_for_plot):
sns.countplot(data=df, x=col, hue='y', ax=axes[i])
axes[i].set_title(f'{col} vs y')
axes[i].tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
17. Визуализация распределений и зависимостей
fig, axes = plt.subplots(2, 3, figsize=(18, 10))axes = axes.ravel()
num_cols_for_plot = numeric_cols[:6]
for i, col in enumerate(num_cols_for_plot):
sns.boxplot(data=df, x='y', y=col, ax=axes[i])
axes[i].set_title(f'{col} vs y')
plt.tight_layout()
plt.show()
18. Визуализация распределений и зависимостей
print("\n=== Средняя продолжительность разговорав зависимости от результата ===")
print(df.groupby('y')['duration'].mean())
19. Визуализация распределений и зависимостей
df['pdays_contacted'] = (df['pdays'] != 1).astype(int)print("\n=== Был ли контакт ранее? ===")
print(df.groupby('pdays_contacted')['y'].value_c
ounts(normalize=True).unstack())
20. Классификация
21.
df = df.drop(columns=['duration'])22.
X = df.drop(columns=['y'])df['y'] = df['y'].map({'yes': 1, 'no': 0})
y = df['y']
23.
categorical_cols = X.select_dtypes(include=['object']).columns.tolist()numeric_cols = X.select_dtypes(include=['int64',
'float64']).columns.tolist()
encoder = OneHotEncoder(drop='first', sparse_output=False,
handle_unknown='ignore')
X_cat_encoded = encoder.fit_transform(X[categorical_cols])
feature_names = encoder.get_feature_names_out(categorical_cols)
X_cat_df = pd.DataFrame(X_cat_encoded, columns=feature_names,
index=X.index)
X_final = pd.concat([X[numeric_cols], X_cat_df], axis=1)
24.
X_train, X_test, y_train, y_test =train_test_split(
X_final, y, test_size=0.2, random_state=42,
stratify=y
)
25.
clf = DecisionTreeClassifier(random_state=42)clf.fit(X_train, y_train)
26.
y_pred = clf.predict(X_test)27.
#joblib.dump(clf, 'decision_tree_model.pkl')#clf_loaded =
joblib.load('decision_tree_model.pkl')
28.
feature_importance = pd.DataFrame({'feature': X_final.columns,
'importance': clf.feature_importances_
}).sort_values(by='importance', ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(data=feature_importance.head(10),
x='importance', y='feature')
plt.title('Top-10 важных признаков (Decision Tree)')
plt.xlabel('Важность')
plt.show()
29.
print("=== Accuracy ===")print(f"{accuracy_score(y_test, y_pred):.4f}")
print("\n=== Classification Report ===")
print(classification_report(y_test, y_pred,
target_names=['no', 'yes']))
30.
plt.figure(figsize=(6, 5))cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d',
cmap='Blues', xticklabels=['no', 'yes'],
yticklabels=['no', 'yes'])
plt.title('Confusion Matrix')
plt.ylabel('Истинные метки')
plt.xlabel('Предсказанные метки')
plt.show()
31.
plt.figure(figsize=(20, 10))tree.plot_tree(clf,
feature_names=X_final.columns, class_names=['0',
'1'], filled=True, fontsize=10)
plt.title('Дерево решений')
plt.show()
plt.savefig('decision_tree.png', dpi=300,
bbox_inches='tight') # Сохранение в файл
plt.close()
32. Cross-validation
33.
clf = DecisionTreeClassifier(random_state=42)accuracy_scores = cross_val_score(clf, X_final,
y, cv=5, scoring='accuracy')
print("=== Кросс-валидация ===")
for i, score in enumerate(accuracy_scores, 1):
print(f"Fold {i}: {score:.4f}")
print(f"Accuracy: {accuracy_scores.mean():.4f}
± {accuracy_scores.std():.4f}")
34. GridSearch
35.
param_grid = {'max_depth': [3, 5, 7, 10, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 5],
'criterion': ['gini', 'entropy']
}
dt = DecisionTreeClassifier(random_state=42)
grid_search = GridSearchCV(
estimator=dt,
param_grid=param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1,
verbose=1
)
# 6. Обучение с подбором параметров
grid_search.fit(X_train, y_train)
# 7. Лучшая модель и оценка качества
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
print("Лучшие параметры:", grid_search.best_params_)
print("Точность (Accuracy):", accuracy_score(y_test, y_pred))
print("\nОтчёт по классификации:\n", classification_report(y_test, y_pred, target_names=['no', 'yes']))
36.
plt.figure(figsize=(20, 10))tree.plot_tree(best_model,
feature_names=X_final.columns, class_names=['0',
'1'], filled=True, fontsize=10)
plt.title('Дерево решений')
plt.show()
plt.savefig('best_model_decision_tree.png',
dpi=300, bbox_inches='tight') # Сохранение в
файл
plt.close()
37. Регрессия
38.
# 1. Загрузка данныхdf = pd.read_csv('/content/bank.csv', sep=';')
# 2. Удаление признака 'duration' — он недоступен до звонка
df = df.drop(columns=['duration'])
# 3. Разделение на признаки и целевую переменную
X = df.drop(columns=['previous'])
y = df['previous']
# 4. Кодирование категориальных признаков
categorical_cols = X.select_dtypes(include=['object']).columns.tolist()
numeric_cols = X.select_dtypes(include=[np.number]).columns.tolist()
# OneHotEncoding
encoder = OneHotEncoder(drop='first', sparse_output=False, handle_unknown='ignore')
X_cat_encoded = ncoder.fit_transform(X[categorical_cols])
X_cat_df = pd.DataFrame(X_cat_encoded, columns=encoder.get_feature_names_out(categorical_cols))
# Объединение с числовыми признаками
X_final = pd.concat([X[numeric_cols].reset_index(drop=True), X_cat_df.reset_index(drop=True)], axis=1)
# 5. Разделение на train/test
X_train, X_test, y_train, y_test = train_test_split(
X_final, y, test_size=0.2, random_state=42
)
39.
# 6. Обучение модели линейной регрессииmodel = GradientBoostingRegressor()
model.fit(X_train, y_train)
# 7. Предсказание
y_pred = model.predict(X_test)
# 8. Оценка качества
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MAE: {mae:.2f}")
print(f"MSE: {mse:.2f}")
print(f"R²: {r2:.4f}")
# 9. Визуализация: истинные vs предсказанные значения
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('Истинный balance')
plt.ylabel('Предсказанный balance')
plt.title('Истинные vs Предсказанные значения (Linear Regression)')
plt.grid(True)
plt.show()