Dans le tutoriel Kaggle / Titanic, nous apprenons avec RandomForestClassifier ()
. Ajustez ce paramètre pour voir si la précision d'apprentissage s'améliore.
import numpy as np
import pandas as pd
import seaborn
import matplotlib.pyplot as plt
train_data = pd.read_csv("../train.csv")
from sklearn.model_selection import train_test_split
train_data_orig = train_data
train_data, cv_data = train_test_split(train_data_orig, test_size=0.3, random_state=1)
En utilisant train_test_split
, divisez les données en train: cv = 7: 3 (cv; validation croisée).
train_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 623 entries, 114 to 37
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 623 non-null int64
1 Survived 623 non-null int64
2 Pclass 623 non-null int64
3 Name 623 non-null object
4 Sex 623 non-null object
5 Age 496 non-null float64
6 SibSp 623 non-null int64
7 Parch 623 non-null int64
8 Ticket 623 non-null object
9 Fare 623 non-null float64
10 Cabin 135 non-null object
11 Embarked 622 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 63.3+ KB
cv_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 268 entries, 862 to 92
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 268 non-null int64
1 Survived 268 non-null int64
2 Pclass 268 non-null int64
3 Name 268 non-null object
4 Sex 268 non-null object
5 Age 218 non-null float64
6 SibSp 268 non-null int64
7 Parch 268 non-null int64
8 Ticket 268 non-null object
9 Fare 268 non-null float64
10 Cabin 69 non-null object
11 Embarked 267 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 27.2+ KB
Il y a 623 trains, 268 cvs et un total de 891.
from sklearn.ensemble import RandomForestClassifier
features = ["Pclass", "Sex", "SibSp", "Parch"]
y = train_data["Survived"]
y_cv = cv_data["Survived"]
X = pd.get_dummies(train_data[features])
X_cv = pd.get_dummies(cv_data[features])
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)
print('Train score: {}'.format(model.score(X, y)))
print('CV score: {}'.format(model.score(X_cv, y_cv)))
Train score: 0.8394863563402889
CV score: 0.753731343283582
Le train est correct à environ 84%, mais le CV n'est correct qu'à 75%.
n_estimator
Essayez de changer la valeur de n_estimator
.
rfc_results = pd.DataFrame(columns=["train", "cv"])
for iter in [1, 10, 100]:
model = RandomForestClassifier(n_estimators=iter, max_depth=5, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)
rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train | cv | |
---|---|---|
1 | 0.826645 | 0.753731 |
10 | 0.833066 | 0.753731 |
100 | 0.839486 | 0.753731 |
À mesure que le nombre d'arbres de décision augmente, le score du train augmente légèrement, mais le score cv ne change pas.
max_depth
Essayez de changer la valeur de max_depth
.
max_depth = 2
for iter in [1, 10, 100]:
model = RandomForestClassifier(n_estimators=iter, max_depth=2, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)
rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train | cv | |
---|---|---|
1 | 0.813804 | 0.731343 |
10 | 0.81862 | 0.753731 |
100 | 0.817014 | 0.761194 |
J'ai obtenu un score CV de 76%.
max_depth = 3
for iter in [1, 10, 100]:
model = RandomForestClassifier(n_estimators=iter, max_depth=3, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)
rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train | cv | |
---|---|---|
1 | 0.81862 | 0.753731 |
10 | 0.82504 | 0.776119 |
100 | 0.82504 | 0.768657 |
J'ai obtenu un score CV de 77,6%.
max_depth = 4
for iter in [1, 10, 100]:
model = RandomForestClassifier(n_estimators=iter, max_depth=4, random_state=1, max_features="auto")
model.fit(X, y)
predictions = model.predict(X_cv)
rfc_results.loc[iter] = model.score(X, y), model.score(X_cv, y_cv)
train | cv | |
---|---|---|
1 | 0.823435 | 0.764925 |
10 | 0.82825 | 0.761194 |
100 | 0.826645 | 0.764925 |
Le score du cv est d'environ 76,5%.
D'après ce qui précède, avec max_depth = 3
, n_estimators = 10
avait le score le plus élevé.
Trouvez le meilleur paramètre avec une méthode appelée GridSearch (GridSearchCV
). Il s'agit d'une méthode pour tester la combinaison des paramètres répertoriés et trouver le meilleur.
from sklearn.model_selection import GridSearchCV
param_grid = {"max_depth": [2, 3, 4, 5, None],
"n_estimators":[1, 3, 10, 30, 100],
"max_features":["auto", None]}
model_grid = GridSearchCV(estimator=RandomForestClassifier(random_state=1),
param_grid = param_grid,
scoring="accuracy", # metrics
cv = 3, # cross-validation
n_jobs = 1) # number of core
model_grid.fit(X, y) #fit
model_grid_best = model_grid.best_estimator_ # best estimator
print("Best Model Parameter: ", model_grid.best_params_)
Notez la ligne from
. Quand j'ai cherché sur le net, il y avait un moyen d'écrire depuis sklearn.grid_search import GridSearchCV
, mais dans mon cas, c'était NG.
Best Model Parameter: {'max_depth': 3, 'max_features': 'auto', 'n_estimators': 10}
Comme j'ai essayé manuellement, max_depth = 3
et n_estimators = 10
étaient les meilleurs. J'ai aussi essayé deux types de max_features
, mais"auto"
était bon.
print('Train score: {}'.format(model.score(X, y)))
print('CV score: {}'.format(model.score(X_cv, y_cv)))
Train score: 0.826645264847512
CV score: 0.7649253731343284
J'ai prédit le résultat en utilisant ce paramètre et l'ai soumis à Kaggle. Cependant, la précision était de 0,77751 et *** était le même que le paramètre comme dans le tutoriel ***. Bien.
Avant d'essayer d'améliorer la quantité de caractéristiques, nous avons pu l'améliorer un peu en ajustant les hyper paramètres de l'apprentissage, puis nous aimerions considérer la quantité de caractéristiques.
Recommended Posts