[Liệu bạn có biết] Bài 2: Cách xác định sử dụng kĩ thuật nào trong ML
Trong bài toán Machine Learning của chúng ta chia ra làm 3 bài toán con là: Supervised Learning - Unsupervised Learning - Reinforcement Learning, nhưng trong đó Supervised Learning là bài toán mà chúng ta gặp thường xuyên nhất. Trong Supervised Learning có 2 loại chính là Classification - Regression và trong mỗi loại đó có rất nhiều thuật toán để xử lí, ví dụ như:
- Classification: Support Vector Machine, Decision Trees, Random Forest,....
- Regression: Linear Regression, Polynomial Regression, Ridge Regression, Lasso Regression,....
Vậy câu hỏi đặt ra là: có quá nhiều thuật toán để xử lí vậy làm sao chúng ta xác định được thuật toán nào phù hợp cho bài toán của mình
Cách chọn thuật toán phù hợp
Ngày xưa chắc hẳn các bạn đã biết đến 2 phương pháp: GridsearchCV hoặc RandomizedSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
Điều tệ nhất về những phương pháp này là mất quá nhiều thời gian để tìm kiếm thuật toán phù hợp vì phương pháp của Grid/Random Search là sử dụng vòng lặp để kiểm tra tất cả các trường hợp. Mặc dù cách này không tệ nhưng cũng chưa đủ tốt, vì vậy mình sẽ chỉ cho các bạn một cách mới để tìm ra thuật toán tốt nhất.
Lazy predict
Lazy predict giúp chúng ta xác định nên chọn thuật toán nào cho phù hợp với bài toán 1 cách nhanh, gọn, lẹ và dễ dàng
Các bạn có thể cài đặt Lazy Predict bằng lệnh:
pip install lazypredict
Điều tuyệt vời nhất về Lazy Predict là tốc độ,nó mất ít thời gian hơn nhiều để tìm ra thuật toán phù hợp với bộ dữ liệu của bạn, nhưng chỉ với các tham số mặc định.
Cách dùng
Sẽ có những thư viện mà các bạn chưa từng thấy bao giờ nhưng cũng không cần phải import trước khi dùng Lazy predict
Classification
from lazypredict.Supervised import LazyClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
X = data.data
y= data.target
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=.5,random_state =123)
clf = LazyClassifier(verbose=0,ignore_warnings=True, custom_metric=None)
models,predictions = clf.fit(X_train, X_test, y_train, y_test)
print(models)
Model | Accuracy | Balanced Accuracy | ROC AUC | F1 Score | Time Taken |
---|---|---|---|---|---|
LinearSVC | 0.989474 | 0.987544 | 0.987544 | 0.989462 | 0.0150008 |
SGDClassifier | 0.989474 | 0.987544 | 0.987544 | 0.989462 | 0.0109992 |
MLPClassifier | 0.985965 | 0.986904 | 0.986904 | 0.985994 | 0.426 |
Perceptron | 0.985965 | 0.984797 | 0.984797 | 0.985965 | 0.0120046 |
LogisticRegression | 0.985965 | 0.98269 | 0.98269 | 0.985934 | 0.0200036 |
LogisticRegressionCV | 0.985965 | 0.98269 | 0.98269 | 0.985934 | 0.262997 |
SVC | 0.982456 | 0.979942 | 0.979942 | 0.982437 | 0.0140011 |
CalibratedClassifierCV | 0.982456 | 0.975728 | 0.975728 | 0.982357 | 0.0350015 |
PassiveAggressiveClassifier | 0.975439 | 0.974448 | 0.974448 | 0.975464 | 0.0130005 |
LabelPropagation | 0.975439 | 0.974448 | 0.974448 | 0.975464 | 0.0429988 |
LabelSpreading | 0.975439 | 0.974448 | 0.974448 | 0.975464 | 0.0310006 |
RandomForestClassifier | 0.97193 | 0.969594 | 0.969594 | 0.97193 | 0.033 |
GradientBoostingClassifier | 0.97193 | 0.967486 | 0.967486 | 0.971869 | 0.166998 |
QuadraticDiscriminantAnalysis | 0.964912 | 0.966206 | 0.966206 | 0.965052 | 0.0119994 |
HistGradientBoostingClassifier | 0.968421 | 0.964739 | 0.964739 | 0.968387 | 0.682003 |
RidgeClassifierCV | 0.97193 | 0.963272 | 0.963272 | 0.971736 | 0.0130029 |
RidgeClassifier | 0.968421 | 0.960525 | 0.960525 | 0.968242 | 0.0119977 |
AdaBoostClassifier | 0.961404 | 0.959245 | 0.959245 | 0.961444 | 0.204998 |
ExtraTreesClassifier | 0.961404 | 0.957138 | 0.957138 | 0.961362 | 0.0270066 |
KNeighborsClassifier | 0.961404 | 0.95503 | 0.95503 | 0.961276 | 0.0560005 |
BaggingClassifier | 0.947368 | 0.954577 | 0.954577 | 0.947882 | 0.0559971 |
BernoulliNB | 0.950877 | 0.951003 | 0.951003 | 0.951072 | 0.0169988 |
LinearDiscriminantAnalysis | 0.961404 | 0.950816 | 0.950816 | 0.961089 | 0.0199995 |
GaussianNB | 0.954386 | 0.949536 | 0.949536 | 0.954337 | 0.0139935 |
NuSVC | 0.954386 | 0.943215 | 0.943215 | 0.954014 | 0.019989 |
DecisionTreeClassifier | 0.936842 | 0.933693 | 0.933693 | 0.936971 | 0.0170023 |
NearestCentroid | 0.947368 | 0.933506 | 0.933506 | 0.946801 | 0.0160074 |
ExtraTreeClassifier | 0.922807 | 0.912168 | 0.912168 | 0.922462 | 0.0109999 |
CheckingClassifier | 0.361404 | 0.5 | 0.5 | 0.191879 | 0.0170043 |
DummyClassifier | 0.512281 | 0.489598 | 0.489598 | 0.518924 | 0.0119965 |
Regression
from lazypredict.Supervised import LazyRegressor
from sklearn import datasets
from sklearn.utils import shuffle
import numpy as np
boston = datasets.load_boston()
X, y = shuffle(boston.data, boston.target, random_state=13)
X = X.astype(np.float32)
offset = int(X.shape[0] * 0.9)
X_train, y_train = X[:offset], y[:offset]
X_test, y_test = X[offset:], y[offset:]
reg = LazyRegressor(verbose=0, ignore_warnings=False, custom_metric=None)
models, predictions = reg.fit(X_train, X_test, y_train, y_test)
print(models)
Model | Adjusted R-Squared | R-Squared | RMSE | Time Taken |
---|---|---|---|---|
SVR | 0.83 | 0.88 | 2.62 | 0.01 |
BaggingRegressor | 0.83 | 0.88 | 2.63 | 0.03 |
NuSVR | 0.82 | 0.86 | 2.76 | 0.03 |
RandomForestRegressor | 0.81 | 0.86 | 2.78 | 0.21 |
XGBRegressor | 0.81 | 0.86 | 2.79 | 0.06 |
GradientBoostingRegressor | 0.81 | 0.86 | 2.84 | 0.11 |
ExtraTreesRegressor | 0.79 | 0.84 | 2.98 | 0.12 |
AdaBoostRegressor | 0.78 | 0.83 | 3.04 | 0.07 |
HistGradientBoostingRegressor | 0.77 | 0.83 | 3.06 | 0.17 |
PoissonRegressor | 0.77 | 0.83 | 3.11 | 0.01 |
LGBMRegressor | 0.77 | 0.83 | 3.11 | 0.07 |
KNeighborsRegressor | 0.77 | 0.83 | 3.12 | 0.01 |
DecisionTreeRegressor | 0.65 | 0.74 | 3.79 | 0.01 |
MLPRegressor | 0.65 | 0.74 | 3.80 | 1.63 |
HuberRegressor | 0.64 | 0.74 | 3.84 | 0.01 |
GammaRegressor | 0.64 | 0.73 | 3.88 | 0.01 |
LinearSVR | 0.62 | 0.72 | 3.96 | 0.01 |
RidgeCV | 0.62 | 0.72 | 3.97 | 0.01 |
BayesianRidge | 0.62 | 0.72 | 3.97 | 0.01 |
Ridge | 0.62 | 0.72 | 3.97 | 0.01 |
TransformedTargetRegressor | 0.62 | 0.72 | 3.97 | 0.01 |
LinearRegression | 0.62 | 0.72 | 3.97 | 0.01 |
ElasticNetCV | 0.62 | 0.72 | 3.98 | 0.04 |
LassoCV | 0.62 | 0.72 | 3.98 | 0.06 |
LassoLarsIC | 0.62 | 0.72 | 3.98 | 0.01 |
LassoLarsCV | 0.62 | 0.72 | 3.98 | 0.02 |
Lars | 0.61 | 0.72 | 3.99 | 0.01 |
LarsCV | 0.61 | 0.71 | 4.02 | 0.04 |
SGDRegressor | 0.60 | 0.70 | 4.07 | 0.01 |
TweedieRegressor | 0.59 | 0.70 | 4.12 | 0.01 |
GeneralizedLinearRegressor | 0.59 | 0.70 | 4.12 | 0.01 |
ElasticNet | 0.58 | 0.69 | 4.16 | 0.01 |
Lasso | 0.54 | 0.66 | 4.35 | 0.02 |
RANSACRegressor | 0.53 | 0.65 | 4.41 | 0.04 |
OrthogonalMatchingPursuitCV | 0.45 | 0.59 | 4.78 | 0.02 |
PassiveAggressiveRegressor | 0.37 | 0.54 | 5.09 | 0.01 |
GaussianProcessRegressor | 0.23 | 0.43 | 5.65 | 0.03 |
OrthogonalMatchingPursuit | 0.16 | 0.38 | 5.89 | 0.01 |
ExtraTreeRegressor | 0.08 | 0.32 | 6.17 | 0.01 |
DummyRegressor | -0.38 | -0.02 | 7.56 | 0.01 |
LassoLars | -0.38 | -0.02 | 7.56 | 0.01 |
KernelRidge | -11.50 | -8.25 | 22.74 | 0.01 |
Hi vọng bài viết này sẽ giúp các bạn trong việc xử lí bài toán về Machine Learning
All rights reserved