По сути, у меня есть модель в sklearn, которая предсказывает выживаемость Титаника. его точность составляет около 0,77.
Как я могу сделать это лучше и точнее?
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, LabelEncoder, MinMaxScaler
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier
train_df = pd.read_csv("train.csv")
test_df = pd.read_csv("test.csv")
le = LabelEncoder()
sc = StandardScaler()
train_df['Age'].fillna(train_df['Age'].mean(), inplace=True)
train_df["Embarked"].fillna("N", inplace=True)
train_df['Cabin'] = train_df['Cabin'].str[:1]
train_df['Cabin'].fillna('N', inplace=True)
train_df["Cabin"]
for col in ["Sex", "Embarked", "Cabin"]:
train_df[col] = LabelEncoder().fit_transform(train_df[col])
x = train_df.drop(["PassengerId","Name","Ticket", "Survived"], axis=1)
y = train_df["Survived"]
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
dt_clf = DecisionTreeClassifier(max_depth= 5, min_samples_leaf= 1,min_samples_split= 2)
dt_clf.fit(x_train, y_train)
pred = dt_clf.predict(x_test)
print(metrics.accuracy_score(y_test, pred))
Я залил на среднее значение и поменял масштабатор и алгоритм, но ничего не произошло.






Обработка пропущенных значений: Вы заполнили недостающие значения в поле «Возраст» средним значением. Чтобы пойти еще дальше, рассмотрите возможность использования других методов для заполнения пропущенных значений, таких как медиана, мода или даже использование прогнозных моделей.
Особенности проектирования: Вы можете создать некоторые новые функции. Например:
Масштабирование и кодирование: В настоящее время вы используете LabelEncoder для категориальных переменных. Рассмотрите возможность использования OneHotEncoder или pd.get_dummies для лучшей обработки категориальных переменных. Кроме того, обязательно применяйте соответствующие методы масштабирования.
Выбор функции: Вы должны выбрать наиболее важные функции. Вы можете использовать такие методы, как рекурсивное исключение функций (RFE), важность функций из моделей или корреляционные матрицы, чтобы исключить менее важные функции.
Выбор модели и настройка гиперпараметров: Вы используете DecisionTreeClassifier. Возможно, вы можете попробовать разные алгоритмы и использовать перекрестную проверку для точной настройки гиперпараметров. Это поможет вам подобрать оптимальное сочетание для вашей модели.
Перекрестная проверка и настройка гиперпараметров: Чтобы найти лучшие гиперпараметры для вашей модели, рассмотрите возможность использования GridSearchCV или RandomizedSearchCV.
Посмотрите на мой восстановленный код:
import seaborn as sns
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
# Load Titanic dataset from Seaborn
titanic = sns.load_dataset('titanic')
print("Dataset loaded.")
# Feature engineering
titanic['FamilySize'] = titanic['sibsp'] + titanic['parch']
titanic['IsAlone'] = (titanic['FamilySize'] == 0).astype(int)
titanic['deck'] = titanic['deck'].cat.add_categories('N').fillna('N')
print("Feature engineering completed.")
# Dropping features
dropped_features = ['alive', 'adult_male', 'embark_town', 'alone']
titanic.drop(dropped_features, axis=1, inplace=True)
print(f"Dropped less useful features: {dropped_features}")
# Preprocessing
numeric_features = ['age', 'fare', 'FamilySize']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())])
categorical_features = ['sex', 'deck', 'embarked', 'who', 'class']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
print("Preprocessing setup completed.")
# Splitting data
X = titanic.drop('survived', axis=1)
y = titanic['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("Data split into training and testing sets.")
# Define models and their hyperparameters
models = {
'RandomForest': {
'model': RandomForestClassifier(random_state=42),
'params': {
'classifier__n_estimators': [100, 200],
'classifier__max_depth': [5, 10],
'classifier__min_samples_split': [2, 5],
'classifier__min_samples_leaf': [1, 2]
}
},
'LogisticRegression': {
'model': LogisticRegression(max_iter=1000),
'params': {
'classifier__C': [0.01, 0.1, 1, 10],
'classifier__solver': ['lbfgs', 'liblinear']
}
},
'SVM': {
'model': SVC(),
'params': {
'classifier__C': [0.1, 1, 10],
'classifier__gamma': ['scale', 'auto'],
'classifier__kernel': ['linear', 'rbf']
}
},
'GradientBoosting': {
'model': GradientBoostingClassifier(random_state=42),
'params': {
'classifier__n_estimators': [100, 200],
'classifier__learning_rate': [0.01, 0.1],
'classifier__max_depth': [3, 5]
}
},
'XGBoost': {
'model': XGBClassifier(random_state=42),
'params': {
'classifier__n_estimators': [100, 200],
'classifier__learning_rate': [0.01, 0.1],
'classifier__max_depth': [3, 5]
}
}
}
# Function to perform grid search and return the best model
def perform_grid_search(X_train, y_train, model, params):
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', model)])
grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
return grid_search
best_models = {}
for model_name, model_info in models.items():
print(f"Training {model_name}...")
best_models[model_name] = perform_grid_search(X_train, y_train, model_info['model'], model_info['params'])
print(f"{model_name} training completed.")
# Evaluate models
for model_name, model in best_models.items():
best_model = model.best_estimator_
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'{model_name} Best Hyperparameters: {model.best_params_}')
print(f'{model_name} Accuracy: {accuracy}')
# Select the best model based on accuracy
best_model_name = max(best_models, key=lambda name: accuracy_score(y_test, best_models[name].best_estimator_.predict(X_test)))
print(f'Best model: {best_model_name} with accuracy {accuracy_score(y_test, best_models[best_model_name].best_estimator_.predict(X_test))}')
Моя точность около 0,821.
Вы можете включить братьев и сестер/супругов из набора данных в свое обучение.