Bài đăng này là một phần của loạt bài bao gồm các bài tập từ lớp học máy của Andrew Ng trên Coursera. Mã gốc, văn bản bài tập và tệp dữ liệu cho bài đăng này có sẵn tại đây
Phần 1 — Hồi quy tuyến tính đơn giản
Phần 2 — Hồi quy tuyến tính đa biến
Phần 3 — Hồi quy logistic
Phần
Part 5 — Neural Networks
Part 6 — Support Vector Machines
Part 7 — K-Means Clustering & PCA
Part 8 — Anomaly Detection & Recommendation
Trong phần 1 của loạt bài về học máy bằng Python, chúng ta đã xem phần đầu tiên của bài tập 1 trong lớp Học máy của Andrew Ng. Trong bài đăng này, chúng tôi sẽ kết thúc bài tập 1 bằng cách hoàn thành phần 2 của bài tập. Nếu bạn còn nhớ, trong phần 1, chúng ta đã thực hiện hồi quy tuyến tính để dự đoán lợi nhuận của một chiếc xe bán thức ăn mới dựa trên dân số của thành phố mà chiếc xe tải đó sẽ được đặt vào. Đối với phần 2, chúng tôi có một nhiệm vụ mới - dự đoán giá mà một ngôi nhà sẽ bán. Sự khác biệt lần này là chúng ta có nhiều hơn một biến phụ thuộc. Chúng tôi đã cung cấp cả kích thước của ngôi nhà tính bằng feet vuông và số phòng ngủ trong nhà. Chúng ta có thể dễ dàng mở rộng mã trước đây của mình để xử lý hồi quy tuyến tính đa biến không?
Đầu tiên chúng ta hãy xem dữ liệu
path = os.getcwd[] + '\data\ex1data2.txt'
data2 = pd.read_csv[path, header=None, names=['Size', 'Bedrooms', 'Price']]
data2.head[]
[Ghi chú. Phương tiện không thể kết xuất bảng — ví dụ đầy đủ ở đây]
Lưu ý rằng quy mô của các giá trị cho mỗi biến là rất khác nhau. Một ngôi nhà thường sẽ có 2–5 phòng ngủ nhưng có thể có từ hàng trăm đến hàng nghìn mét vuông. Nếu chúng tôi chạy thuật toán hồi quy của mình trên dữ liệu này như hiện tại, thì biến "kích thước" sẽ có trọng số quá nặng và cuối cùng sẽ làm giảm bất kỳ đóng góp nào từ tính năng "số lượng phòng ngủ". Để khắc phục điều này, chúng ta cần thực hiện một thứ gọi là “chuẩn hóa tính năng”. Tức là chúng ta cần điều chỉnh quy mô của các tính năng để tạo sân chơi bình đẳng. Một cách để làm điều này là lấy giá trị trung bình của đối tượng đó trừ đi giá trị trung bình của từng giá trị trong một đối tượng địa lý, sau đó chia cho độ lệch chuẩn. May mắn thay, đây là một dòng mã sử dụng gấu trúc
data2 = [data2 - data2.mean[]] / data2.std[]
data2.head[]
[Ghi chú. Phương tiện không thể kết xuất bảng — ví dụ đầy đủ ở đây]
Tiếp theo, chúng ta cần sửa đổi cách triển khai hồi quy tuyến tính từ phần 1 để xử lý nhiều hơn 1 biến phụ thuộc. Hay chúng ta?
def gradientDescent[X, y, theta, alpha, iters]:
temp = np.matrix[np.zeros[theta.shape]]
parameters = int[theta.ravel[].shape[1]]
cost = np.zeros[iters] for i in range[iters]:
error = [X * theta.T] - y for j in range[parameters]:
term = np.multiply[error, X[:,j]]
temp[0,j] = theta[0,j] - [[alpha / len[X]] * np.sum[term]] theta = temp
cost[i] = computeCost[X, y, theta] return theta, cost
Nhìn kỹ vào dòng mã tính thuật ngữ lỗi. lỗi = [X * theta. T] — y. Lúc đầu có thể không rõ ràng nhưng chúng tôi đang sử dụng tất cả các phép toán ma trận. Đây là sức mạnh của đại số tuyến tính tại nơi làm việc. Mã này sẽ hoạt động chính xác cho dù có bao nhiêu biến [cột] trong X, miễn là số lượng tham số trong theta phù hợp. Tương tự, nó sẽ tính toán lỗi cho mọi hàng trong X miễn là số lượng hàng trong y bằng nhau. Trên hết, đó là một phép tính rất hiệu quả. Đây là một cách mạnh mẽ để áp dụng BẤT KỲ biểu thức nào cho một số lượng lớn các phiên bản cùng một lúc
Vì cả hàm giảm độ dốc và hàm chi phí của chúng tôi đều đang sử dụng các phép toán ma trận, nên trên thực tế, không có thay đổi nào đối với mã cần thiết để xử lý hồi quy tuyến tính đa biến. Hãy thử nghiệm nó. Trước tiên chúng ta cần thực hiện một vài thao tác khởi tạo để tạo các ma trận thích hợp để chuyển đến các hàm của chúng ta
# add ones column
data2.insert[0, 'Ones', 1]# set X [training data] and y [target variable]
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]# convert to matrices and initialize theta
X2 = np.matrix[X2.values]
y2 = np.matrix[y2.values]
theta2 = np.matrix[np.array[[0,0,0]]]
Bây giờ chúng tôi đã sẵn sàng để thử. Hãy xem điều gì sẽ xảy ra
# perform linear regression on the data set
g2, cost2 = gradientDescent[X2, y2, theta2, alpha, iters]# get the cost [error] of the model
computeCost[X2, y2, g2]
0. 13070336960771897
Trông đầy hứa hẹn. Chúng ta cũng có thể vẽ đồ thị tiến trình huấn luyện để xác nhận rằng trên thực tế, lỗi đã giảm dần với mỗi lần lặp lại quá trình giảm dần độ dốc
fig, ax = plt.subplots[figsize=[12,8]]
ax.plot[np.arange[iters], cost2, 'r']
ax.set_xlabel['Iterations']
ax.set_ylabel['Cost']
ax.set_title['Error vs. Training Epoch']
Chi phí hoặc lỗi của giải pháp giảm xuống sau mỗi lần lặp lại liên tiếp cho đến khi chạm đáy. Đây chính xác là những gì chúng ta mong đợi sẽ xảy ra. Có vẻ như thuật toán của chúng tôi đã hoạt động
Điều đáng chú ý là chúng ta KHÔNG PHẢI triển khai bất kỳ thuật toán nào từ đầu để giải quyết vấn đề này. Điều tuyệt vời về Python là cộng đồng nhà phát triển khổng lồ và sự phong phú của phần mềm mã nguồn mở. Trong lĩnh vực máy học, thư viện Python hàng đầu là scikit-learning. Hãy xem cách chúng ta có thể xử lý tác vụ hồi quy tuyến tính đơn giản từ phần 1 bằng cách sử dụng lớp hồi quy tuyến tính của scikit-learn
from sklearn import linear_model
model = linear_model.LinearRegression[]
model.fit[X, y]
Nó không dễ dàng hơn thế nhiều. Có rất nhiều tham số cho phương thức “phù hợp” mà chúng ta có thể điều chỉnh tùy thuộc vào cách chúng ta muốn thuật toán hoạt động, nhưng các giá trị mặc định đủ hợp lý cho vấn đề của chúng ta nên tôi để chúng yên. Hãy thử vẽ sơ đồ các tham số được trang bị để xem nó so sánh như thế nào với các kết quả trước đó của chúng tôi
x = np.array[X[:, 1].A1]
f = model.predict[X].flatten[]fig, ax = plt.subplots[figsize=[12,8]]
ax.plot[x, f, 'r', label='Prediction']
ax.scatter[data.Population, data.Profit, label='Traning Data']
ax.legend[loc=2]
ax.set_xlabel['Population']
ax.set_ylabel['Profit']
ax.set_title['Predicted Profit vs. Population Size']
Lưu ý rằng tôi đang sử dụng chức năng “dự đoán” để lấy các giá trị y được dự đoán để vẽ đường thẳng. Điều này dễ dàng hơn nhiều so với việc cố gắng thực hiện thủ công. Scikit-learning có API tuyệt vời với nhiều chức năng tiện lợi cho quy trình học máy điển hình. Chúng tôi sẽ khám phá một số trong số này chi tiết hơn trong các bài đăng trong tương lai
Điều này là dành cho hôm nay. Trong phần 3, chúng ta sẽ xem qua bài tập 2 và đi sâu vào một số nhiệm vụ phân loại bằng hồi quy logistic