Chuyển đến nội dung chính

TPOT trong Python

Trong hướng dẫn này, bạn sẽ học cách sử dụng một thư viện rất độc đáo trong Python, TPOT. Lý do khiến thư viện này đặc biệt là vì nó tự động hóa toàn bộ pipeline Machine Learning và cung cấp cho bạn mô hình học máy có hiệu suất tốt nhất.
· 13 phút đọc

Khám phá cùng AI

Trong hướng dẫn này, bạn sẽ học cách sử dụng một thư viện rất độc đáo trong Python: tpot. Lý do khiến thư viện này đặc biệt là vì nó tự động hóa toàn bộ quy trình Machine Learning và cung cấp cho bạn mô hình học máy có hiệu suất tốt nhất. Cụ thể hơn, bạn sẽ học:

  • Ý tưởng đằng sau Automated Machine Learning
  • TPOT sử dụng Lập trình Di truyền để chọn mô hình học máy tốt nhất như thế nào
  • Sử dụng TPOT trên một tập dữ liệu trong Python
  • Hạn chế của TPOT

Hãy bắt đầu nào!

Giới thiệu

Có rất nhiều thành phần bạn phải cân nhắc trước khi giải quyết một bài toán học máy, bao gồm chuẩn bị dữ liệu, chọn đặc trưng, kỹ thuật đặc trưng, chọn và kiểm định mô hình, tinh chỉnh siêu tham số, v.v. Về lý thuyết, bạn có thể tìm và áp dụng vô số kỹ thuật cho mỗi thành phần này, nhưng chúng có thể cho hiệu quả khác nhau trên các tập dữ liệu khác nhau. Thách thức là tìm ra tổ hợp kỹ thuật cho hiệu suất tốt nhất để giảm thiểu lỗi trong dự đoán. Đây là lý do chính mà ngày nay mọi người đang phát triển các thuật toán và nền tảng Auto-ML để bất kỳ ai, dù không có chuyên môn về học máy, cũng có thể xây dựng mô hình mà không tốn nhiều thời gian hay công sức. Một nền tảng như vậy có sẵn dưới dạng thư viện Python: TPOT. Bạn có thể coi TPOT là Trợ lý Khoa học Dữ liệu của mình. TPOT là một công cụ Automated Machine Learning bằng Python, tối ưu hóa các pipeline học máy bằng lập trình di truyền. Nó sẽ tự động hóa phần nhàm chán nhất của học máy bằng cách khám phá thông minh hàng nghìn pipeline khả dĩ để tìm ra pipeline tốt nhất cho dữ liệu của bạn.

from IPython.core.display import Image
Image(filename="/home/manishpathak/DataCamp/tpot/tpot-ml-pipeline.png",width=800,height=800)
sơ đồ tự động hóa bởi tpot

Khi TPOT hoàn tất việc tìm kiếm, nó sẽ cung cấp cho bạn đoạn mã Python của pipeline tốt nhất mà nó tìm thấy để bạn có thể tinh chỉnh thêm từ đó.

Cài đặt

Để cài đặt tpot trên hệ thống của bạn, bạn có thể chạy lệnh sudo pip install tpot trên terminal dòng lệnh hoặc xem liên kết này. tpot được xây dựng dựa trên một số thư viện Python hiện có, bao gồm numpy, scipy, scikit-learn, DEAP, update_checker, tqdm, stopit, pandas. Hầu hết các gói Python cần thiết có thể được cài đặt qua bản phân phối Anaconda Python, hoặc bạn cũng có thể cài đặt riêng lẻ. Tùy chọn, bạn cũng có thể cài đặt XGBoost nếu bạn muốn tpot sử dụng các mô hình eXtreme Gradient Boosting.

Lập trình Di truyền

Với dữ liệu phù hợp, năng lực tính toán và mô hình học máy thích hợp, bạn có thể tìm ra lời giải cho bất kỳ vấn đề nào, nhưng việc biết nên dùng mô hình nào có thể là một thách thức vì có quá nhiều mô hình như Decision Trees, SVM, KNN, v.v. Đó là lúc lập trình di truyền trở nên hữu ích và có thể hỗ trợ. Thuật toán di truyền lấy cảm hứng từ quá trình Chọn lọc Tự nhiên theo Darwin và được dùng để tạo ra lời giải cho các bài toán tối ưu hóa và tìm kiếm trong khoa học máy tính.

Nói chung, Thuật toán Di truyền có ba thuộc tính:

  • Chọn lọc: Bạn có một quần thể các lời giải khả dĩ cho một bài toán và một hàm đánh giá (fitness). Ở mỗi vòng lặp, bạn đánh giá mức độ phù hợp của từng lời giải bằng hàm này.
  • Lai ghép: Sau đó bạn chọn những lời giải tốt nhất và thực hiện lai ghép để tạo ra quần thể mới.
  • Đột biến: Bạn lấy những “đứa con” đó và gây đột biến với một số thay đổi ngẫu nhiên rồi lặp lại quá trình cho đến khi có lời giải phù hợp hoặc tốt nhất.

Lập trình Di truyền tự nó là một chủ đề lớn trong khoa học máy tính, nhưng nếu bạn muốn đào sâu vào thuật toán di truyền, hãy xem series video này.

Vậy tất cả điều này liên quan gì đến khoa học dữ liệu?

Thực ra, việc chọn đúng mô hình học máy và toàn bộ siêu tham số tốt nhất cho mô hình đó bản thân nó là một bài toán tối ưu hóa mà lập trình di truyền có thể được dùng. Thư viện Python tpot được xây dựng trên scikit-learn sử dụng lập trình di truyền để tối ưu hóa pipeline học máy của bạn. Ví dụ, trong học máy, sau khi chuẩn bị dữ liệu, bạn cần biết nên đưa đặc trưng nào vào mô hình và nên xây dựng các đặc trưng đó ra sao. Khi đã có các đặc trưng, bạn đưa chúng vào mô hình để huấn luyện, rồi tinh chỉnh siêu tham số để đạt kết quả tối ưu. Thay vì tự mình làm tất cả các bước này bằng thử-sai, TPOT tự động hóa các bước đó cho bạn bằng lập trình di truyền và xuất ra đoạn mã tối ưu khi hoàn tất.

Để hiểu sâu hơn, bạn sẽ thực hành dùng thư viện tpot trên một tập dữ liệu nguồn mở. Tập dữ liệu bạn sẽ dùng là MAGIC Gamma Telescope DataSet. Dữ liệu được tạo ra để mô phỏng việc ghi nhận các hạt gamma năng lượng cao trong kính thiên văn gamma Cherenkov đặt trên mặt đất bằng kỹ thuật ảnh. Để biết chi tiết đầy đủ về mô tả tập dữ liệu, hãy xem liên kết này. Tập dữ liệu có các thuộc tính/đặc trưng sau:

  1. fLength: liên tục # trục lớn của elip [mm]
  2. fWidth: liên tục # trục nhỏ của elip [mm]
  3. fSize: liên tục # log cơ số 10 của tổng nội dung tất cả pixel [tính theo #phot]
  4. fConc: liên tục # tỉ lệ tổng của hai pixel cao nhất trên fSize [tỉ lệ]
  5. fConc1: liên tục # tỉ lệ pixel cao nhất trên fSize [tỉ lệ]
  6. fAsym: liên tục # khoảng cách từ pixel cao nhất đến tâm, chiếu lên trục lớn [mm]
  7. fM3Long: liên tục # căn bậc ba của mô men bậc ba dọc theo trục lớn [mm]
  8. fM3Trans: liên tục # căn bậc ba của mô men bậc ba dọc theo trục nhỏ [mm]
  9. fAlpha: liên tục # góc giữa trục lớn với vectơ tới gốc tọa độ [độ]
  10. fDist: liên tục # khoảng cách từ gốc tọa độ đến tâm elip [mm]
  11. class: g,h # gamma (tín hiệu), hadron (nhiễu nền) (biến mục tiêu)

Mục tiêu là phân loại một quan sát là gamma (tín hiệu mong muốn) hay hadron (nhiễu nền) dựa trên các thuộc tính đã cho.

Bạn sẽ bắt đầu bằng cách nhập các thư viện pandas và numpy để lần lượt đọc dữ liệu và thực hiện các phép tính trên đó.

import pandas as pd
import numpy as np

Dùng hàm read_csv() của pandas để đọc tập dữ liệu thành một DataFrame. Đồng thời, chỉ định tham số header = None vì tập dữ liệu hiện chưa có tên cột.

telescope_data=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/magic/magic04.data',header=None)

Kiểm tra nội dung của DataFrame bằng phương thức head().

telescope_data.head()
dataframe 1

Để đặt tên cho các cột của DataFrame, bạn có thể dùng thuộc tính columns trên DataFrame của pandas và gán cho nó một danh sách chứa tên các cột.

telescope_data.columns = ['fLength', 'fWidth','fSize','fConc','fConcl','fAsym','fM3Long','fM3Trans','fAlpha','fDist','class']
telescope_data.head()
dataframe 2

Giờ đây bạn cũng đã có tên cột trong DataFrame.

Để lấy thông tin cần thiết về DataFrame như số lượng giá trị trong mỗi cột, kiểu dữ liệu, count, mean, v.v., bạn có thể dùng các phương thức info() và describe() của pandas.

telescope_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 19020 entries, 0 to 19019
Data columns (total 11 columns):
fLength     19020 non-null float64
fWidth      19020 non-null float64
fSize       19020 non-null float64
fConc       19020 non-null float64
fConcl      19020 non-null float64
fAsym       19020 non-null float64
fM3Long     19020 non-null float64
fM3Trans    19020 non-null float64
fAlpha      19020 non-null float64
fDist       19020 non-null float64
class       19020 non-null object
dtypes: float64(10), object(1)
memory usage: 1.6+ MB
telescope_data.describe()
dataframe 3

Hóa ra tất cả các đặc trưng trong DataFrame đều là liên tục. Tuy nhiên, biến/đặc trưng mục tiêu class là phân loại. Bạn có thể kiểm tra số lượng từng lớp trong biến mục tiêu bằng phương thức value_counts().

telescope_data['class'].value_counts()
g    12332
h     6688
Name: class, dtype: int64

Thông thường, xáo trộn dữ liệu ngẫu nhiên trước khi bắt đầu là một ý tưởng hay để tránh bất kỳ kiểu sắp xếp nào trong dữ liệu. Bạn có thể sắp xếp lại dữ liệu trong DataFrame bằng random và hàm permutation() của numpy. Để đặt lại chỉ số sau khi xáo trộn, dùng phương thức reset_index() với tham số drop = True.

telescope_shuffle=telescope_data.iloc[np.random.permutation(len(telescope_data))]
tele=telescope_shuffle.reset_index(drop=True)
tele.head()
dataframe 4

Trước khi dùng tpot, điều quan trọng là bạn phải gán nhãn các biến phân loại trong DataFrame. Để tìm hiểu thêm về gán nhãn biến phân loại, hãy xem hướng dẫn này. Ở đây chỉ biến mục tiêu class là đặc trưng phân loại, vì vậy xử lý chỉ cần thực hiện với cột đó. Bạn sẽ thay lớp g (tín hiệu) bằng giá trị số 0 và lớp h (nền) bằng giá trị số 1. Có thể thực hiện bằng hàm map() với đối số là một dictionary chứa ánh xạ tương ứng của các lớp của biến mục tiêu.

tele['class']=tele['class'].map({'g':0,'h':1})

tele.head()
dataframe 5

Bây giờ bạn lưu các nhãn lớp, là thứ bạn cần dự đoán, vào một biến riêng tele_class.

tele_class = tele['class'].values

Bạn cũng nên xử lý giá trị khuyết trước khi dùng tpot. Để kiểm tra số lượng giá trị khuyết theo cột, bạn có thể chạy lệnh sau:

pd.isnull(tele).any()
fLength     False
fWidth      False
fSize       False
fConc       False
fConcl      False
fAsym       False
fM3Long     False
fM3Trans    False
fAlpha      False
fDist       False
class       False
dtype: bool

Tập dữ liệu này không có giá trị khuyết. Lưu ý với các tập dữ liệu có giá trị khuyết, bạn có thể xóa hàng/cột bằng phương thức dropna() hoặc thay thế giá trị khuyết bằng một giá trị giả bằng phương thức fillna(). Ví dụ, đoạn mã sau sẽ thay giá trị NA bằng giá trị giả -999.

tele = tele.fillna(-999)

Giờ bạn sẽ chia DataFrame thành tập huấn luyện và tập kiểm tra giống như khi làm bất kỳ loại mô hình học máy nào. Bạn có thể làm điều này qua cross_validation train_test_split của sklearn. Các tham số là tele.index làm chỉ mục của DataFrame, train_size = 0.75 để giữ 75% dữ liệu cho tập huấn luyện, test_size = 0.25 để giữ 25% còn lại cho tập kiểm tra và stratify = tele_class là các giá trị nhãn lớp trong tập dữ liệu. Lưu ý tập validation chỉ để cho chúng ta ý niệm về lỗi trên tập kiểm tra. Ở đây nó được giữ giống tập kiểm tra.

from sklearn.cross_validation import train_test_split
training_indices, validation_indices = training_indices, testing_indices = train_test_split(tele.index,
                                                                                            stratify = tele_class,
                                                                                            train_size=0.75, test_size=0.25)

Bạn có thể kiểm tra kích thước của tập huấn luyện và tập validation bằng thuộc tính size.

training_indices.size, validation_indices.size
(14265, 4755)

Giờ là lúc dùng thư viện tpot để gợi ý cho chúng ta pipeline tốt nhất cho bài toán phân loại nhị phân này. Để làm vậy, bạn phải import lớp TPOTClassifier từ thư viện tpot. Nếu đây là bài toán hồi quy, bạn sẽ import lớp TPOTRegressor.

TPOTClassifier có rất nhiều tham số, và bạn có thể đọc tất cả về chúng tại đây. Nhưng những tham số đáng chú ý bạn cần biết là:

  • generations: Số vòng lặp để chạy quá trình tối ưu hóa pipeline. Mặc định là 100.
  • population_size: Số cá thể được giữ lại trong quần thể lập trình di truyền mỗi thế hệ. Mặc định là 100.
  • offspring_size: Số lượng cá thể con được tạo ra trong mỗi thế hệ lập trình di truyền. Mặc định là 100.
  • mutation_rate: Tỷ lệ đột biến cho thuật toán lập trình di truyền trong khoảng [0.0, 1.0]. Tham số này cho biết GP sẽ áp dụng thay đổi ngẫu nhiên lên bao nhiêu pipeline mỗi thế hệ. Mặc định là 0.9
  • crossover_rate: Tỷ lệ lai ghép cho thuật toán lập trình di truyền trong khoảng [0.0, 1.0]. Tham số này cho biết thuật toán sẽ “lai” bao nhiêu pipeline mỗi thế hệ.
  • scoring: Hàm dùng để đánh giá chất lượng của một pipeline đối với bài toán phân loại như accuracy, average_precision, roc_auc, recall, v.v. Mặc định là accuracy.
  • cv: Chiến lược cross-validation dùng khi đánh giá các pipeline. Mặc định là 5.
  • random_state: Hạt giống của bộ sinh số giả ngẫu nhiên dùng trong TPOT. Dùng tham số này để đảm bảo TPOT cho cùng kết quả mỗi lần bạn chạy với cùng tập dữ liệu và cùng seed.

Cũng lưu ý mutation_rate + crossover_rate không được vượt quá 1.0.

Ở đây bạn sẽ dùng tpot với generations = 5 và các tham số còn lại để mặc định. Tham số verbosity = 2 quy định mức độ thông tin TPOT hiển thị khi chạy.

Sau đó bạn sẽ gọi phương thức fit() với tập huấn luyện (không gồm cột mục tiêu) và cột mục tiêu làm đối số.

Lưu ý chạy mã trong ô dưới đây sẽ mất vài giờ để hoàn tất. Với thiết lập TPOT đã cho (5 thế hệ với kích thước quần thể 100), TPOT sẽ đánh giá 500 cấu hình pipeline trước khi kết thúc. Để hình dung con số này, hãy nghĩ về một grid search gồm 500 tổ hợp siêu tham số cho một thuật toán học máy và mất bao lâu để thực hiện. Đó là 500 cấu hình mô hình cần đánh giá với 5-fold cross-validation, tức khoảng 2500 mô hình được fit và đánh giá trên dữ liệu huấn luyện chỉ trong một grid search. Đó là một quy trình tốn thời gian! Sau này, bạn sẽ biết thêm một số đối số có thể truyền vào TPOTClassifier để kiểm soát thời gian thực thi của TPOT.

from tpot import TPOTClassifier
from tpot import TPOTRegressor

tpot = TPOTClassifier(generations=5,verbosity=2)

tpot.fit(tele.drop('class',axis=1).loc[training_indices].values,
         tele.loc[training_indices,'class'].values)
Optimization Progress:  33%|███▎      | 200/600 [41:43<1:51:41, 16.75s/pipeline]

Generation 1 - Current best internal CV score: 0.880266061124

Optimization Progress:  50%|█████     | 300/600 [1:14:37<46:57,  9.39s/pipeline]  

Generation 2 - Current best internal CV score: 0.880266061124

Optimization Progress:  67%|██████▋   | 400/600 [1:59:17<2:21:21, 42.41s/pipeline]

Generation 3 - Current best internal CV score: 0.880266061124

Optimization Progress:  84%|████████▎ | 501/600 [3:01:12<1:02:16, 37.74s/pipeline]

Generation 4 - Current best internal CV score: 0.881597992166

Generation 5 - Current best internal CV score: 0.881597992166

Best pipeline: GradientBoostingClassifier(RobustScaler(PolynomialFeatures(input_matrix, degree=2, include_bias=False, interaction_only=False)), learning_rate=0.1, max_depth=6, max_features=0.6000000000000001, min_samples_leaf=12, min_samples_split=3, n_estimators=100, subsample=0.55)

TPOTClassifier(config_dict={'sklearn.ensemble.GradientBoostingClassifier': {'max_features': array([0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55,
       0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1.  ]), 'learning_rate': [0.001, 0.01, 0.1, 0.5, 1.0], 'min_samples_leaf': [1, 2, 3, 4, 5, 6, 7...  0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1.  ])}, 'sklearn.preprocessing.RobustScaler': {}},
        crossover_rate=0.1, cv=5, disable_update_check=False,
        early_stop=None, generations=5, max_eval_time_mins=5,
        max_time_mins=None, memory=None, mutation_rate=0.9, n_jobs=1,
        offspring_size=100, periodic_checkpoint_folder=None,
        population_size=100, random_state=None, scoring=None,
        subsample=1.0, verbosity=2, warm_start=False)

Ở trên, 5 thế hệ đã được tính toán, mỗi thế hệ cho thấy hiệu quả huấn luyện của mô hình trên tập huấn luyện. Rõ ràng, pipeline tốt nhất là pipeline có điểm chính xác CV 88,16%. Mô hình tạo ra kết quả này là một pipeline gồm các kỹ thuật tiền xử lý như PloynomialFeatures và RobustScaler để bổ sung đặc trưng tổng hợp cho dữ liệu đầu vào và chuẩn hóa chúng, sau đó được bộ phân loại Gradient Boosting sử dụng để đưa ra dự đoán cuối cùng. Bạn cũng có thể nhận thấy tpot đưa ra nhiều giá trị siêu tham số như learning_rate,max_depth, v.v., cùng với bộ phân loại.

Tiếp theo, lỗi kiểm tra được tính để mục đích xác thực.

tpot.score(tele.drop('class',axis=1).loc[validation_indices].values,
           tele.loc[validation_indices, 'class'].values)
0.885173501577287

Như có thể thấy, độ chính xác trên tập kiểm tra là 88,51%.

Cuối cùng, bạn có thể yêu cầu TPOT xuất mã Python tương ứng cho pipeline đã tối ưu vào một tệp văn bản bằng hàm export:

tpot.export('tpot_MAGIC_Gamma_Telescope_pipeline.py')
True
## This is the pipeline that tpot generated: tpot_MAGIC_Gamma_Telescope_pipeline.py
import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures, RobustScaler

# NOTE: Make sure that the class is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1).values
training_features, testing_features, training_target, testing_target = \
            train_test_split(features, tpot_data['target'].values, random_state=42)

# Score on the training set was:0.881597992166
exported_pipeline = make_pipeline(
    PolynomialFeatures(degree=2, include_bias=False, interaction_only=False),
    RobustScaler(),
    GradientBoostingClassifier(learning_rate=0.1, max_depth=6, max_features=0.6, min_samples_leaf=12, min_samples_split=3, n_estimators=100, subsample=0.55)
)

exported_pipeline.fit(training_features, training_target)
results = exported_pipeline.predict(testing_features)

Thật tuyệt vời phải không? Mà không cần bạn phải tinh chỉnh nhiều tham số và tùy chọn để có mô hình tốt nhất, TPOT không chỉ cung cấp thông tin về mô hình tốt nhất mà còn đưa ra đoạn mã chạy được cho mô hình đó!

Như đã đề cập, lần chạy TPOT trước đó mất vài giờ để hoàn thành. Có một số tham số bạn có thể chỉ định để kiểm soát thời gian thực thi của TPOT nhưng đi kèm đánh đổi. Vì bạn giới hạn thời gian chạy TPOT, TPOT sẽ không thể khám phá tất cả pipeline có thể có, do đó mô hình tốt nhất mà TPOT gợi ý khi hết thời gian giới hạn có thể không phải là mô hình tốt nhất có thể cho tập dữ liệu đó. Tuy nhiên, nếu có đủ thời gian, nó sẽ tiến gần đến mô hình tốt nhất. Một số tham số là:

  • max_time_mins: số phút TPOT có để tối ưu pipeline. Nếu không phải None, thiết lập này sẽ ghi đè tham số generations và cho phép TPOT chạy cho đến khi hết max_time_mins phút.
  • max_eval_time_mins: số phút TPOT có để đánh giá một pipeline. Đặt tham số này cao hơn sẽ cho phép TPOT đánh giá các pipeline phức tạp hơn, nhưng cũng khiến TPOT chạy lâu hơn. Dùng tham số này để giúp ngăn TPOT lãng phí thời gian vào các pipeline tốn thời gian. Mặc định là 5.
  • early_stop: số thế hệ mà TPOT kiểm tra xem có cải thiện trong quá trình tối ưu hay không. Kết thúc quá trình tối ưu nếu không có cải thiện trong số thế hệ đã cho.
  • n_jobs: Số tiến trình chạy song song để đánh giá các pipeline trong quá trình tối ưu của TPOT. Đặt n_jobs=-1 sẽ dùng hết số lõi có sẵn trên máy. Lưu ý dùng nhiều tiến trình trên cùng máy có thể gây vấn đề bộ nhớ với các tập dữ liệu lớn. Mặc định là 1.
  • subsample: Tỷ lệ mẫu huấn luyện được dùng trong quá trình tối ưu của TPOT. Phải nằm trong khoảng (0.0, 1.0]. Mặc định là 1.

Để thực hành, bạn sẽ chạy lại TPOT với các đối số bổ sung max_time_mins = 2 và max_eval_time_mins = 0.04 nhưng lần này giảm population_size = 15.

tpot = TPOTClassifier(verbosity=2, max_time_mins=2, max_eval_time_mins=0.04, population_size=15)
tpot.fit(tele.drop('class',axis=1).loc[training_indices].values, tele.loc[training_indices,'class'].values)
Optimization Progress: 42pipeline [00:42,  1.17s/pipeline]                  

Generation 1 - Current best internal CV score: 0.86119902629

Optimization Progress: 64pipeline [01:03,  1.04s/pipeline]                  

Generation 2 - Current best internal CV score: 0.86119902629

Optimization Progress: 83pipeline [01:21,  1.14s/pipeline]

Generation 3 - Current best internal CV score: 0.861689811492

Optimization Progress: 104pipeline [01:45,  1.03pipeline/s]

Generation 4 - Current best internal CV score: 0.861759642796

2.03228221667 minutes have elapsed. TPOT will close down.
TPOT closed prematurely. Will use the current best pipeline.

Best pipeline: XGBClassifier(RobustScaler(SelectPercentile(input_matrix, percentile=85)), learning_rate=0.1, max_depth=2, min_child_weight=4, n_estimators=100, nthread=1, subsample=0.1)

TPOTClassifier(config_dict={'sklearn.ensemble.GradientBoostingClassifier': {'max_features': array([0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55,
       0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1.  ]), 'learning_rate': [0.001, 0.01, 0.1, 0.5, 1.0], 'min_samples_leaf': [1, 2, 3, 4, 5, 6, 7...  0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.85, 0.9 , 0.95, 1.  ])}, 'sklearn.preprocessing.RobustScaler': {}},
        crossover_rate=0.1, cv=5, disable_update_check=False,
        early_stop=None, generations=1000000, max_eval_time_mins=0.04,
        max_time_mins=2, memory=None, mutation_rate=0.9, n_jobs=1,
        offspring_size=15, periodic_checkpoint_folder=None,
        population_size=15, random_state=None, scoring=None, subsample=1.0,
        verbosity=2, warm_start=False)

Như bạn có thể thấy, bộ phân loại hoạt động tốt nhất trong khung thời gian chỉ định giờ đây là XGBoost với SelectPercentile() và RobustScaler() làm các bước tiền xử lý.

Hạn chế

  • TPOT có thể mất nhiều thời gian để hoàn tất việc tìm kiếm

Chạy TPOT không đơn giản như fit một mô hình trên tập dữ liệu. Nó xem xét nhiều thuật toán học máy (random forests, mô hình tuyến tính, SVM, v.v.) trong một pipeline với nhiều bước tiền xử lý (bù giá trị khuyết, chuẩn hóa, PCA, chọn đặc trưng, v.v.), các siêu tham số cho tất cả mô hình và các bước tiền xử lý, cũng như nhiều cách để ensemble hoặc stacking các thuật toán trong pipeline. Đó là lý do nó thường mất nhiều thời gian để thực thi và không khả thi cho các tập dữ liệu lớn.

  • TPOT có thể đề xuất các lời giải khác nhau cho cùng một tập dữ liệu

Nếu bạn làm việc với một tập dữ liệu tương đối phức tạp hoặc chạy TPOT trong thời gian ngắn, các lần chạy TPOT khác nhau có thể đưa ra khuyến nghị pipeline khác nhau. Khi hai lần chạy TPOT đề xuất các pipeline khác nhau, điều đó có nghĩa là chúng chưa hội tụ do thiếu thời gian hoặc có nhiều pipeline cho hiệu năng gần như tương đương trên tập dữ liệu của bạn.

Kết luận

Tuyệt vời! Bạn đã đến cuối hướng dẫn này. Bạn bắt đầu với phần giới thiệu ngắn về ý tưởng phía sau các nền tảng Automated Machine Learning. Sau đó bạn khám phá đôi chút về Lập trình Di truyền và cách TPOT dùng nó để tự động hóa quá trình xây dựng pipeline học máy. Bạn cũng đã thực hành sử dụng thư viện TPOT trong Python trên một tập dữ liệu, đồng thời hiểu thêm về các hàm mà nó cung cấp. Nếu bạn dự định dùng TPOT trong tương lai, tôi thật sự khuyên bạn nên xem tài liệu xuất sắc của nó. Chúc bạn khám phá vui vẻ!

Nếu bạn muốn tìm hiểu thêm về Machine Learning trong Python, hãy học khóa Machine Learning với các Mô hình Dạng Cây trong Python của DataCamp. Ngoài ra, hãy xem hướng dẫn Giới thiệu về Machine Learning trong Python của DataCamp.
 

Các trang web sau đã được dùng làm nguồn khi viết hướng dẫn này.

Chủ đề

Liên quan