Hoc may voi Python (1)




Học máy với Python

 

Chương 1. Tổng quan

 

Mở đầu


Học máy (machine learning) là dạy cho máy tính biết cách tự thực hiện các công việc.

Các vấn đề quan trọng của học máy là: lựa chọn giải thuật phù hợp đối với từng bài toán, cài đặt chương trình và đánh giá kết quả.

Ví dụ đơn giản về học máy: khi sử dụng thư điện tử (email), hàng ngày bạn hay phải phân loại các thư nhận được theo nhóm. Ví dụ, bạn sẽ phân thành các nhóm: gia đình, bạn bè, công việc. Ngày qua ngày, bạn sẽ thấy chán và thấy mất thời gian. Bạn muốn viết một chương trình để máy tính làm công việc này thay cho bạn. Khi viết chương trình, cách tiếp cận mà mọi người hay nghĩ tới là mô phỏng lại quá trình bộ óc của con người đã làm. Cách này khá phức tạp và không hiệu quả. Cách thứ hai là xây dựng một tập dữ liệu gồm các cặp email/nhãn, đây là các email đã được phân loại, dựa trên tập dữ liệu này, chương trình sẽ tìm ra được tập luật, sau đó, máy tính sẽ áp dụng tập luật này để phân loại tự động cho các email mới. Tập dữ liệu ở đây được gọi là dữ liệu huấn luyện (training data).

Máy học có liên quan nhiều đến lĩnh vực thống kê.

Máy học giúp tìm ra các mối liên hệ, những quy luật từ dữ liệu.

Tài liệu này giúp bạn có cái nhìn tổng quan về một số giải thuật đang được sử dụng phổ biến.

Tuy nhiên, bạn cũng nên biết là, việc cài đặt các giải thuật trong học máy để giải quyết một bài toán không phải là tất cả, mà bên cạnh đó, bạn cần phải thực hiện các công việc khác.

Sau đây là các công việc cần phải thực hiện để giải quyết một bài toán:

  1. Đọc và làm sạch dữ liệu đầu vào.
  2. Khảo sát và hiểu dữ liệu đầu vào.
  3. Biểu diễn dữ liệu đầu vào.
  4. Chọn và cài đặt giải thuật.
  5. Đánh giá kết quả.

Đối với dữ liệu đầu vào, các vấn đề bạn hay gặp phải là: dữ liệu có giá trị không hợp lệ, thiếu dữ liệu. Trong một số trường hợp, việc có quá ít dữ liệu hoặc có quá nhiều dữ liệu đều không tốt cho kết quả thực thi.

Dữ liệu cung cấp cho giải thuật thường là dữ liệu đã được tiền xử lý, rất ít giải thuật có thể sử dụng các dữ liệu chưa qua tiền xử lý.

Dữ liệu được tiền xử lý và tổ chức tốt, cộng với một giải thuật đơn giản, vẫn có thể cho ra kết quả tốt hơn rất nhiều so với một giải thuật phức tạp, nhưng chạy trên bộ dữ liệu được tiền xử lý và tổ chức không tốt.

Việc lựa chọn giải thuật phù hợp cho một bài toán là một vấn đề không đơn giản. Trong nhiều tình huống, bạn buộc phải thỏa hiệp giữa thời gian thực thi và độ chính xác của kết quả.

Cuối cùng, việc đánh giá kết quả của giải thuật cũng rất quan trọng.

Để làm các phần thực hành, bạn cần phải cài đặt ngôn ngữ lập trình Python. Để thực hiện các tính toán bạn sẽ sử dụng các gói NumPy (Numeric Python) và SciPy (Scientific Python). Để hiển thị kết quả một cách trực quan, bạn sẽ sử dụng gói Matplotlib.

Enthought Canopy là gói phần mềm có tích hợp sẵn cả Python, Numpy, Scipy, Matplotlib và một số thứ khác.

Vào địa chỉ sau https://store.enthought.com/downloads/ để tải gói Enthought Canopy về máy.

Nhớ lựa chọn phiên bản cho phù hợp với máy tính của bạn. Xem hình bên dưới.



(Tập tin cài đặt trên website là canopy-1.5.1-win-32.msi. Tuy nhiên, khi tôi dùng IDM để tải về máy, thì IDM tự đổi tên tập tin thành canopy-1.5.1-win-32.exe, chạy tập tin này sẽ bị lỗi. Nếu bạn bị tình trạng tương tự, hãy đổi lại đuôi .exe thành .msi là cài đặt được bình thường).

 

Làm quen với NumPy


NumPy là viết tắt của Numeric Python, là một gói chương trình hỗ trợ cho các tính toán khoa học bằng ngôn ngữ lập trình Python.

Xem thêm thông tin về Numpy tại đường dẫn: http://www.numpy.org/

Chạy Enthought Canopy\Code Editor, màn hình kết quả:



Nhập lệnh vào cửa sổ Python.

In [3]: import numpy # nạp gói numpy cho python
In [4]: numpy.version.full_version # xem phiên bản
Out[4]: '1.8.1'

Nạp và đặt lại tên tham chiếu cho gói numpy.

In [7]: import numpy as np

Khai báo mảng a, gồm 6 phần tử, với giá trị của các phần tử là: 0, 1, 2, 3, 4, 5.

In [8]: a = np.array([0, 1, 2, 3, 4, 5])

Xem số chiều của mảng a.

In [10]: a.ndim
Out[10]: 1

Xem dạng biểu diễn của mảng a.

In [12]: a.shape
Out[12]: (6,) # 6 hàng

Tạo ma trận hai chiều b từ mảng dữ liệu một chiều a. Ma trận b gồm 3 hàng, 2 cột. Tuy nhiên, giá trị các phần tử của a và b vẫn duy trì sự đồng bộ, nghĩa là b chưa thực sự là một bản sao độc lập của a. Nếu thay đổi giá trị trong b thì giá trị trong a cũng thay đổi, và ngược lại. Đây là đặc tính của numpy giúp hạn chế việc lặp lại của dữ liệu, giúp tiết kiệm bộ nhớ.

In [13]: b = a.reshape((3,2))
In [14]: b
Out[14]:
array([[0, 1],
           [2, 3],
          [4, 5]])

Xem số chiều và dạng thể hiện của b.

In [15]: b.ndim
Out[15]: 2
In [16]: b.shape
Out[16]: (3, 2)

Thay đổi giá trị một phần tử trong b, ví dụ b[1][0] = 77 (hàng 1, cột 0). Rồi xem kết quả.

In [17]: b[1][0] = 77
In [18]: b
Out[18]:
array([[ 0, 1],
           [77, 3],
          [ 4, 5]])

Xem lại giá trị của a, thấy rằng a cũng bị thay đổi.

In [19]: a
Out[19]: array([ 0, 1, 77, 3, 4, 5])

Để tạo ra ma trận c, là bản sao thực sự độc lập từ a, sử dụng thêm lệnh copy.

In [20]: c = a.reshape((3,2)).copy()
In [21]: c
Out[21]:
array([[ 0, 1],
           [77, 3],
          [ 4, 5]])

Đổi giá trị trong ma trận c, phần tử c[0][0] = -99. Xem kết quả.

In [22]: c[0][0] = -99
In [23]: c
Out[23]:
array([[-99, 1],
           [ 77, 3],
          [ 4, 5]])
In [24]: a
Out[24]: array([ 0, 1, 77, 3, 4, 5])

Numpy cho phép tính toán linh hoạt trên mảng. Ví dụ: nhân tất cả các phần tử của mảng a với 2, hoặc tính bình phương các phần tử.

In [26]: a[2] = 2
In [27]: a
Out[27]: array([0, 1, 2, 3, 4, 5])
In [28]: a*2
Out[28]: array([ 0, 2, 4, 6, 8, 10])
In [29]: a**2
Out[29]: array([ 0, 1, 4, 9, 16, 25])

Chỉ mục trong mảng (indexing)

Cho mảng a gồm 6 phần tử, giá trị của các phần tử là: 1, 2, 87, 3, 4, 5.

In [1]: import numpy as np
In [2]: a = np.array([1,2,87,3,4,5])
In [3]: a
Out[3]: array([ 1, 2, 87, 3, 4, 5])

Để lấy giá trị của một phần tử trong mảng, ta sẽ sử dụng chỉ mục (index) để tham chiếu đến nó.

Ví dụ, muốn lấy giá trị đầu tiên.

In [4]: a[0]
Out[4]: 1

Numpy cho phép sử dụng mảng làm chỉ mục, ví dụ, muốn lấy giá trị của các phần tử thứ 2, 3, 4 trong mảng a, sử dụng lệnh sau.

In [6]: a
Out[6]: array([ 1, 2, 87, 3, 4, 5])
In [7]: a[np.array([2,3,4])]
Out[7]: array([87, 3, 4])

Cho phép so sánh từng phần tử của mảng với một giá trị bất kì.

In [8]: a>4
Out[8]: array([False, False, True, False, False, True], dtype=bool)

Xuất các giá trị trong mảng lớn hơn 4.

In [9]: a[a>4]
Out[9]: array([87, 5])

Thay thế các giá trị vượt ngưỡng bằng một giá trị cụ thể. Ví dụ, thay thế các giá trị lớn hơn 4 của mảng bằng 4.

In [10]: a[a>4] = 4
In [11]: a
Out[11]: array([1, 2, 4, 3, 4, 4])

Có thể sử dụng hàm clip để đưa các giá trị của mảng về một miền cho trước, các giá trị cao hơn hoặc thấp 
hơn ngưỡng sẽ bị thay thế bởi ngưỡng.

In [17]: a
Out[17]: array([1, 2, 4, 3, 4, 4])
In [18]: a.clip(2,3)
Out[18]: array([2, 2, 3, 3, 3, 3])
--------------------------
Tham khảo (lược dịch)
Willi Richert, Luis Pedro Coelho, Building Machine Learning Systems with Python, PACKT publishing, 2013
--------------------------
Cập nhật (2015/1/20)
--------------------------
Đọc thêm