You are on page 1of 58

Dự án 3 - Phân tích thăm dò hành vi

của khách hàng


Khoa học dữ liệu thực hành cho tiếp thị

Cải thiện chiến lược tiếp thị của bạn với học máy sử dụng Python và R

Yoon Hyup Hwan ·

Mục lục
Dự đoán khả năng tương tác tiếp thị Phân tích dự đoán trong tiếp thị

Ứng dụng của phân tích dự đoán trong marketing Đánh giá mô hình phân
loại
Dự đoán khả năng tương tác tiếp thị với mã hóa Biến Python
Mã hóa biến đáp ứng Mã hóa biến phân
loại
Xây dựng mô hình dự đoán Mô hình
rừng ngẫu nhiên
Đào tạo mô hình rừng ngẫu nhiên Đánh giá mô
hình phân loại
Dự đoán khả năng tương tác tiếp thị với mã hóa Biến R
Mã hóa biến đáp ứng Mã hóa biến phân
loại
Xây dựng mô hình dự đoán Mô hình
rừng ngẫu nhiên
Đào tạo mô hình rừng ngẫu nhiên Đánh giá mô
hình phân loại
Tóm tắt
7. Giá trị lâu dài của khách hàng
CLV
Đánh giá mô hình hồi quy
Dự đoán CLV 3 tháng với Python Data cleanup
Phân tích dữ liệu

Dự đoán chuẩn bị dữ liệu CLV 3


tháng Hồi quy tuyến tính
Đánh giá hiệu suất mô hình hồi quy Dự đoán CLV 3 tháng
với R
Dọn dẹp dữ liệu
Phân tích dữ liệu

Dự đoán chuẩn bị dữ liệu CLV 3


tháng Hồi quy tuyến tính
Đánh giá hiệu suất mô hình hồi quy
Tóm tắt
8. Phân khúc khách hàng theo hướng dữ liệu Thuật
toán phân khúc khách hàng

Phân khúc khách hàng bằng tính năng dọn dẹp


Python Data
phân cụm k-means
Lựa chọn số lượng cụm tốt nhất Diễn giải phân khúc
khách hàng
Phân khúc khách hàng bằng R Data
cleanup
phân cụm k-means
Lựa chọn số lượng cụm tốt nhất Diễn giải phân khúc
khách hàng
Tóm tắt
9. Giữ chân khách hàng

Khách hàng rời bỏ và giữ chân Mạng nơ-


ron nhân tạo
Dự đoán tỷ lệ rời bỏ của khách hàng với phân tích và
chuẩn bị Python Data
ANN với đánh giá Mô

hình Keras
Dự đoán tỷ lệ rời bỏ của khách hàng với R Phân
tích dữ liệu và chuẩn bị ANN với Keras
Đánh giá mô hình
Tóm tắt
5. Phần 5: Ra quyết định tốt hơn
12. Thử nghiệm A / B để có chiến lược tiếp thị tốt hơn Thử
nghiệm A / B cho tiếp thị Thử nghiệm giả thuyết
thống kê

Đánh giá kết quả A/B testing với Python Data analysis
Kiểm tra giả thuyết thống kê Đánh giá kết quả thử
nghiệm A / B với R
Phân tích dữ liệu
Tóm tắt kiểm tra giả thuyết thống kê
13. Tiếp theo là gì&#x27?
Tóm tắt các chủ đề được đề cập trong cuốn sách này Xu
hướng trong tiếp thị

Quy trình làm việc khoa học


dữ liệu Mô hình máy học
Khoa học dữ liệu thực tế thách thức Những thách
thức trong dữ liệu
Những thách thức về cơ sở hạ tầng
Những thách thức trong việc lựa chọn mô hình phù hợp
Tóm tắt thêm các mô hình và gói máy học
Những cuốn sách khác bạn có thể thích
Để lại đánh giá - cho độc giả khác biết suy nghĩ của bạn
Dự đoán khả năng tương
tác tiếp thị
Trong chương này, chúng tôi sẽ mở rộng kiến thức chúng tôi thu được từ
chương trước và bài tập phân tích khách hàng mà chúng tôi đã thực hiện
trong Chapte r 7, Phân tích thăm dò hành vi của khách hàng. Để có những chiến lược marketing
thành công và thông minh hơn, chúng ta không thể dừng lại ở việc phân
tích dữ liệu khách hàng. Với công nghệ tiên tiến trong khoa học dữ liệu và
máy học, giờ đây chúng tôi có thể đưa ra những phỏng đoán và ước tính
thông minh về hành vi trong tương lai của khách hàng, chẳng hạn như loại khách hàng
nào có nhiều khả năng tương tác với các nỗ lực tiếp thị , số lượng mua hàng mà khách hàng có khả
năng thực hiện hoặc loại nào khách hàng có khả năng thực hiện hoặc loại nào
khách hàng có khả năng rời bỏ. Những dự đoán hoặc phỏng đoán thông
minh này được xây dựng dựa trên dữ liệu khách hàng lịch sử có thể giúp
bạn cải thiện hiệu suất tiếp thị và điều chỉnh thêm chiến lược tiếp thị của
mình cho các đối tượng mục tiêu khác nhau. Trong chương này, chúng ta sẽ
tìm hiểu cách chúng ta có thể sử dụng khoa học dữ liệu và học máy để dự
đoán kết quả trong tương lai và cách điều này có thể giúp ích cho các nỗ lực
tiếp thị trong tương lai của bạn.

Trong chương này, chúng tôi sẽ đề cập đến các

chủ đề sau: Phân tích dự đoán trong tiếp thị


Đánh giá mô hình phân loại
Dự đoán khả năng tương tác tiếp thị với Python Dự đoán khả
năng tương tác tiếp thị với R
Phân tích dự đoán trong tiếp thị
Phân tích dự đoán là một quá trình phân tích và trích xuất thông tin từ dữ
liệu lịch sử để xác định các mẫu và đưa ra dự đoán về kết quả trong tương
lai. Nhiều mô hình thống kê và máy học thường được sử dụng để tìm mối
quan hệ giữa các thuộc tính hoặc tính năng trong tập dữ liệu và biến hoặc
hành vi mục tiêu mà bạn muốn dự đoán. Phân tích dự đoán có thể được
sử dụng và áp dụng trong nhiều ngành công nghiệp khác nhau.

Ví dụ, nó thường được sử dụng trong ngành tài chính để phát hiện gian lận,
nơi các mô hình học máy được đào tạo để phát hiện và ngăn chặn các giao
dịch gian lận tiềm ẩn. Ngành chăm sóc sức khỏe cũng có thể hưởng lợi từ
các phân tích dự đoán để giúp các bác sĩ trong quá trình ra quyết định của
họ. Hơn nữa, có nhiều phần khác nhau của tiếp thị cũng có thể được
hưởng lợi từ các phân tích dự đoán, chẳng hạn như thu hút khách hàng, giữ chân
khách hàng, bán thêm và bán kèm, để kể tên một số.

Trong phân tích dự đoán, nói rộng ra, có hai loại vấn đề:

Vấn đề phân loại: Vấn đề phân loại là nơi có một tập hợp các danh
mục mà một quan sát có thể thuộc về. Ví dụ: dự đoán liệu khách hàng
có mở email tiếp thị hay không là một vấn đề phân loại. Chỉ có hai kết
quả có thể xảy ra là mở email tiếp thị hoặc không mở email.
Các bài toán hồi quy: Mặt khác, một bài toán hồi quy là nơi kết quả
có thể đảm nhận bất kỳ phạm vi số thực nào. Ví dụ, dự đoán giá trị
trọn đời của khách hàng là một vấn đề hồi quy. Một khách hàng có thể có giá
trị trọn đời là 0 đô la và một khách hàng khác có thể có giá trị trọn đời là
10,000 đô la. Loại vấn đề này, trong đó kết quả có thể nhận các giá trị
liên tục, được gọi là bài toán hồi quy.

Trong chương này, chúng ta sẽ tập trung vào một trong những vấn đề
phân loại phổ biến trong ngành tiếp thị — dự đoán khả năng tương tác của
khách hàng. Trong chương tiếp theo, Chương 9, Giá trị trọn đời của khách
hàng,
Chúng tôi sẽ giải quyết một trong những vấn đề hồi quy thường xuyên
xuất hiện trong ngành tiếp thị.
Ứng dụng của phân tích dự đoán
trong marketing
Như đã đề cập ngắn gọn trước đây, có rất nhiều cách để áp dụng và sử
dụng phân tích dự đoán trong tiếp thị. Trong phần này, chúng ta sẽ thảo
luận về bốn trường hợp sử dụng phổ biến của phân tích dự đoán trong tiếp
thị:

Khả năng tương tác: Phân tích dự đoán có thể giúp các nhà tiếp thị dự
báo khả năng tương tác của khách hàng với các chiến lược tiếp thị của
họ. Ví dụ: nếu hoạt động tiếp thị của bạn diễn ra nhiều trong không
gian email, bạn có thể sử dụng phân tích dự đoán để dự đoán khách
hàng nào có khả năng cao mở email tiếp thị của bạn và tùy chỉnh- điều
chỉnh chiến lược tiếp thị của bạn cho những khách hàng có khả năng
cao đó để tối đa hóa kết quả tiếp thị của bạn. Một ví dụ khác, nếu bạn
đang hiển thị quảng cáo trên phương tiện truyền thông xã hội, phân
tích dự đoán có thể giúp bạn xác định một số loại khách hàng nhất
định có khả năng nhấp vào quảng cáo.
Giá trị lâu dài của khách hàng: Phân tích dự đoán có thể giúp bạn
dự báo giá trị trọn đời dự kiến của khách hàng. Sử dụng dữ liệu giao
dịch lịch sử, phân tích dự đoán có thể giúp bạn xác định những khách
hàng có giá trị cao trong cơ sở khách hàng của mình. Với những dự
đoán này, bạn và công ty của bạn có thể tập trung nhiều hơn vào việc
xây dựng mối quan hệ lành mạnh với những khách hàng có giá trị
cao đó. Chúng ta sẽ thảo luận trong
Chi tiết hơn về cách xây dựng các mô hình dự đoán cho dự báo giá trị
trọn đời của khách hàng trong chương sau.
Đề xuất các sản phẩm và nội dung phù hợp: Như chúng ta đã thảo
luận trong Chương 6, Đề xuất sản phẩm phù hợp, chúng ta có thể sử dụng
khoa học dữ liệu và máy học để dự đoán khách hàng nào có khả
năng mua sản phẩm hoặc xem nội dung. Sử dụng các dự đoán này,
bạn có thể cải thiện tỷ lệ chuyển đổi của khách hàng bằng cách đề
xuất các sản phẩm và nội dung phù hợp cho từng khách hàng.
Thu hút và giữ chân khách hàng: Phân tích dự đoán cũng đã được
sử dụng nhiều để thu hút và giữ chân khách hàng. Dựa trên
Dữ liệu hồ sơ bạn đã thu thập về khách hàng tiềm năng hoặc khách
hàng tiềm năng và dữ liệu lịch sử của khách hàng hiện tại, bạn có thể
áp dụng phân tích dự đoán để xác định khách hàng tiềm năng chất lượng cao
hoặc xếp hạng khách hàng tiềm năng theo khả năng họ được chuyển
đổi thành khách hàng đang hoạt động. Mặt khác, bạn có thể sử dụng dữ liệu
khách hàng rời đi và dữ liệu lịch sử của khách hàng hiện tại để phát triển các
mô hình dự đoán nhằm dự báo khách hàng nào có khả năng rời khỏi
hoặc hủy đăng ký sản phẩm của bạn. Chúng ta sẽ thảo luận chi tiết hơn
về việc áp dụng phân tích dự đoán để giữ chân khách hàng trong Chương 11,
Giữ chân khách hàng.

Ngoài bốn trường hợp sử dụng phổ biến này của phân tích dự đoán trong
tiếp thị, có nhiều cách khác để bạn có thể sử dụng phân tích dự đoán cho
các chiến lược tiếp thị của mình. Bạn nên sáng tạo về cách thức và địa điểm
sử dụng phân tích dự đoán cho các chiến lược tiếp thị trong tương lai của
mình.
Đánh giá mô hình phân loại
Khi phát triển các mô hình dự đoán, điều quan trọng là phải biết cách đánh
giá các mô hình đó . Trong phần này, chúng ta sẽ thảo luận về năm cách
khác nhau để đánh giá hiệu suất của các mô hình phân loại. Số liệu đầu tiên
có thể được sử dụng để đo lường hiệu suất dự đoán là độ chính xác. Độ chính
xác chỉ đơn giản là tỷ lệ phần trăm dự đoán chính xác trong số tất cả các
dự đoán, như được hiển thị trong công thức sau:

Số liệu thứ hai thường được sử dụng cho các vấn đề phân loại là độ chính
xác. Độ chính xác được định nghĩa là số lượng dương tính thực chia cho
tổng số dương tính thật và dương tính giả. Dương tính thực là trường hợp
mô hình dự đoán chính xác là dương, trong khi dương tính giả là trường
hợp mô hình được dự đoán là dương, nhưng nhãn thực là Âm tính. Công
thức trông như sau:

Cùng với độ chính xác, thu hồi cũng thường được sử dụng để đánh giá hiệu
suất của các mô hình phân loại. Thu hồi được định nghĩa là số lượng dương
tính thực sự chia cho số dương tính thực cộng với âm tính giả. Âm tính
giả là trường hợp mô hình được dự đoán là âm, nhưng nhãn thực là dương.
Việc thu hồi có thể được coi là thước đo lượng các trường hợp dương tính
được lấy ra hoặc tìm thấy bởi mô hình. Công thức trông như sau:
Hai chỉ số cuối cùng mà chúng ta sẽ thảo luận là đường cong đặc tính hoạt
động của máy thu (ROC) và khu vực dưới đường cong ( AUC). Đường
cong ROC cho thấy tỷ lệ dương tính thực và tỷ lệ dương tính giả thay đổi
như thế nào ở các ngưỡng khác nhau. AUC chỉ đơn giản là tổng diện tích
dưới đường cong ROC. AUC dao động từ 0 đến 1 và số AUC cao hơn cho
thấy hiệu suất mô hình tốt hơn. Bộ phân loại ngẫu nhiên có AUC là 0,5, vì
vậy bất kỳ trình phân loại nào có AUC cao hơn 0,5 đều cho thấy mô hình
hoạt động tốt hơn các dự đoán ngẫu nhiên. Một đường cong ROC điển hình
trông như sau:
Trong bài tập lập trình sau đây, chúng ta sẽ sử dụng năm số liệu này mà
chúng ta vừa thảo luận để đánh giá hiệu suất của mô hình mà chúng ta xây
dựng bằng Python và R. Bây giờ chúng ta hãy đi sâu vào việc xây dựng các
mô hình máy học để dự đoán khả năng tương tác tiếp thị!
Dự đoán khả năng tương tác tiếp
thị với Python
Trong phần này, chúng ta sẽ thảo luận về cách xây dựng các mô hình dự
đoán bằng cách sử dụng các thuật toán học máy trong Python. Cụ thể hơn,
chúng ta sẽ học cách xây dựng một mô hình dự đoán bằng thuật toán rừng
ngẫu nhiên , cũng như cách điều chỉnh mô hình rừng ngẫu nhiên và đánh
giá hiệu suất của mô hình. Chúng tôi sẽ chủ yếu sử dụng gấu trúc, matplotlib và
scikit-
các gói để phân tích, trực quan hóa và xây dựng các mô hình máy học
Tìm hiểu
dự đoán khả năng tương tác tiếp thị của khách hàng. Đối với những độc giả
muốn sử dụng R thay vì Python cho bài tập này, bạn có thể chuyển sang
phần tiếp theo.

bài tập này, chúng tôi sẽ sử dụng một trong những bộ dữ liệu
Đối với có sẵn
công khai từ IBM, có thể được tìm thấy tại liên kết này :
https://www.ibm.com/communities/analy tics / watson-analytics-blog / marketing-customer-value-analysis /. Bạn có thể theo
liên kết này và tải xuống dữ liệu có sẵn ở định dạng CSV , được đặt tên là
WA_Fn UseC_ Phân tích giá trị khách hàng tiếp thị.csv. Khi bạn đã tải xuống dữ liệu này, bạn có
thể tải nó vào sổ ghi chép Jupyter của mình bằng cách chạy lệnh sau:
Nhập gấu trúc dưới dạng PD

df = pd.read_csv('.. /data/WA_Fn-UseC_-Marketing-Customer-Value-Analysis.csv')

Khung dữ liệu df trông như sau:


Như bạn có thể nhận thấy, đây cũng là tập dữ liệu mà chúng tôi đã sử
dụng trong chương trước, nơi chúng tôi tiến hành phân tích khách hàng.
Với kiến thức chúng ta có được về tập dữ liệu này từ chương trước,
trước tiên chúng ta sẽ chuẩn bị dữ liệu của mình bằng cách mã hóa biến
mục tiêu và các phân loại khác các biến mà chúng ta sẽ sử dụng làm tính
năng cho các mô hình máy học của mình.
Mã hóa biến đổi
Để xây dựng các mô hình học máy bằng gói scikit-learn trong Python, tất cả các
tính năng trong tập dữ liệu cần phải có các giá trị số.
Tuy nhiên, trong tập dữ liệu, chúng ta có nhiều cột có giá trị không phải số.
Ví dụ, biến đích, Response, là những gì chúng ta sẽ cố gắng dự đoán với các mô
hình học máy, là không phải số. Nó chứa hai giá trị chuỗi—Có và Không.
Chúng ta sẽ cần mã hóa biến mục tiêu Response này bằng các giá trị số để có
thể xây dựng các mô hình học máy. Một ví dụ khác, cột Giới tính, mà chúng
ta có thể sử dụng làm một trong những tính năng cho mô hình dự đoán của
mình, cũng không có giá trị số. Nó chứa hai giá trị chuỗi — F cho nữ và M
cho nam. Trong phần này, chúng ta sẽ thảo luận về cách chúng ta có thể mã hóa
các cột không phải số này để chúng ta có thể sử dụng chúng làm tính năng cho
các mô hình học máy.
Mã hóa biến phản hồi
Điều đầu tiên chúng ta sẽ làm là encode biến response. Chúng ta sẽ mã hóa các
giá trị Yes với giá trị 1 s và No với 0s. Hãy xem đoạn code sau:

df['Engaged'] = df['Response'].apply(lambda x: 1 if x == 'Yes' else 0)

Như các bạn có thể thấy từ code này, chúng ta đang sử dụng hàm apply của
pandas DataFrame để áp dụng hàm lambda của chúng ta trên cột Response, để nó mã hóa các
giá trị Yes với giá trị 1 và No với 0. Sau đó, chúng tôi lưu trữ các giá trị được mã
hóa này trong một cột mới tạo, Engaged. Để có được phản hồi tổng thể hoặc
tỷ lệ tương tác bằng cách sử dụng cột mới tạo này, bạn có thể sử dụng mã
sau:
tdf['Đã tham gia'].mean()

Tỷ lệ tương tác tổng thể trông như sau:


Mã hóa biến phân loại
Nếu bạn xem xét kỹ dữ liệu, các biến sau là các biến phân loại:
columns_to_encode = [
"Kênh bán hàng", "Kích thước xe", "Hạng xe", "Chính sách", "Loại hợp đồng", "Tình trạng việc
làm", "Tình trạng hôn nhân", "Trình độ học vấn", "Phạm vi bảo hiểm "
]

Các biến này có một tập hợp các giá trị khác nhau mà chúng có thể lấy và
các giá trị đó không nhất thiết phải có các thứ tự phân biệt cái này với cái
khác.

Nếu bạn nhớ lại từ Chương 4 , Từ tương tác đến chuyển đổi, có nhiều cách để
mã hóa các biến phân loại. Trong chương này, phương pháp chúng ta sẽ
sử dụng là tạo các biến giả cho từng loại biến phân loại riêng lẻ, sử dụng
hàm get_dummies trong gói gấu trúc.
Hãy xem đoạn mã sau:
categorical_features = []
cho col trong columns_to_encode:
encoded_df = pd.get_dummies(df[col])
encoded_df.columns = [col.replace(' ', '.') + '.' + x cho x trong encoded_df.columns]

categorical_features += list(encoded_df.columns) df = pd.concat([df,


encoded_df], trục=1)

Như bạn có thể thấy từ đoạn mã này, chúng tôi đang lặp lại thông qua danh
sách tên cột của các biến phân loại, được xác định trong columns_to_encode. Sau
đó, đối với mỗi cột, chúng ta đang sử dụng hàm get_dummies trong gói pandas để
xây dựng các biến giả. Để làm cho mọi thứ rõ ràng và ít gây nhầm lẫn
hơn, chúng tôi đang đổi tên các cột của encoded_df DataFrame mới được tạo và
mã hóa, trong đó mỗi cột chứa thông tin về tên cột gốc và thể loại mà nó
đại diện. Ví dụ, đối với
cột Kênh bán hàng , encoded_df DataFrame mới được tạo sẽ trông như sau:
Như bạn có thể thấy từ ví dụ này, mỗi cột của DataFrame mới này đại diện
cho từng danh mục trong cột Kênh bán hàng ban đầu và các giá trị được mã hóa
một nóng, có nghĩa là nó gán giá trị là 1 nếu bản ghi đã cho thuộc về
danh mục đã cho và 0 nếu không.

Khi chúng ta đã tạo các biến giả cho cột đã cho, sau đó chúng ta lưu trữ các
cột mới được tạo thành một biến có tên là categorical_features. Cuối cùng, chúng ta
nối DataFrame mới được tạo này với DataFrame gốc, bằng cách sử dụng hàm
concat của package pandas . Một trong các tham số trong hàm concat , axis=1,
yêu cầu gấu trúc nối hai DataFrame theo cột.

Đến bây giờ, chúng ta đã code thành công tất cả các biến categorical ngoại trừ
Giới tính. Vì chúng ta không cần tạo hai biến giả cho Gender
cột, vì chỉ có thể có hai giới tính, chúng ta sẽ tạo một biến chứa thông tin
về giới tính của một bản ghi nhất định. Hãy xem đoạn mã sau:
df['Is.Female'] = df['Gender'].apply(lambda x : 1 if x == 'F' else 0)
categorical_features.append('Is.Female')
Như các bạn có thể thấy từ code này, chúng ta đang tạo một column mới có
tên là Is.Female. Chúng tôi đang sử dụng chức năng áp dụng của gấu trúc DataFrame
và mã hóa tất cả con cái với giá trị là 1 và tất cả con đực có giá trị bằng 0.
Xây dựng mô hình dự đoán
Chúng tôi gần như đã sẵn sàng để bắt đầu xây dựng và đào tạo các mô hình
máy học để dự đoán phản hồi hoặc mức độ tương tác của khách hàng. Có
một số điều cần dọn dẹp trong dữ liệu của chúng tôi. Hãy xem đoạn mã
sau:
all_features = continuous_features + phản hồi categorical_features = 'Đã tham gia'

sample_df = df[all_features + [phản hồi]]


sample_df.columns = [x.replace(' ', '.') với x trong sample_df.columns] all_features = [x.replace('
', '.') cho x trong all_features]

Như các bạn có thể thấy từ code này, chúng ta đang tạo ra một DataFrame
sample_df mới, chứa tất cả các tính năng, all_features và biến phản hồi , phản hồi.
Sau đó, chúng tôi đang dọn dẹp cột và tên tính năng bằng cách thay thế
tất cả các khoảng trắng trong tên bằng dấu chấm. Sau những
dọn dẹp, sample_df DataFrame bây giờ trông như sau:

Bây giờ chúng ta đã có một bộ mẫu mà chúng ta có thể đào tạo và kiểm
tra các mô hình máy học của mình, hãy chia tập mẫu này thành hai tập
hợp con — một tập hợp để đào tạo các mô hình và một cái khác để thử
nghiệm và đánh giá các mô hình được đào tạo. Gói học máy Python, scikit-
learn, có chức năng chia một tập mẫu nhất định thành các tập hợp đào tạo
và kiểm tra. Hãy xem đoạn mã sau:
từ sklearn.model_selection nhập khẩu train_test_split

x_train, x_test, y_train, y_test = train_test_split(sample_df[all_features ], sample_df[response], test_size=0.3)


Trong mô-đun model_selection của gói scikit-learn, có một hàm được đặt tên là
train_test_split. Hàm này lấy tập mẫu và sự cố mong muốn giữa kích thước tập
hợp tàu và tập kiểm tra làm tham số đầu vào và trả về đoàn tàu và bộ
kiểm tra ngẫu nhiên chẻ. Như bạn có thể thấy từ đoạn mã này, chúng tôi
đang sử dụng 70% bộ mẫu để đào tạo và 30% còn lại để thử nghiệm. Sau
đây cho thấy bảng phân tích của tàu và bộ thử nghiệm từ bộ mẫu:

Như bạn có thể thấy ở đây, có tổng cộng 9,134 bản ghi trong sample_df, 6,393
bản ghi trong x_train và 2,741 bản ghi trong x_test, có nghĩa là khoảng 70% trong
số Bộ mẫu đã đi vào bộ tàu và 30% còn lại của bộ mẫu được đưa vào bộ
thử nghiệm. Chúng tôi sẽ sử dụng các bộ đào tạo và thử nghiệm này để
xây dựng và đánh giá các mô hình trong các phần sau.
Mô hình rừng ngẫu nhiên
Với dữ liệu mà chúng tôi đã chuẩn bị cho đến nay, chúng tôi sẽ xây dựng
một mô hình dự đoán, sử dụng thuật toán rừng ngẫu nhiên, dự đoán liệu
khách hàng sẽ phản hồi hay tham gia vào chiến dịch tiếp thị. Trong gói scikit-
learn của Python, thuật toán rừng ngẫu nhiên được triển khai trong mô-đun
tổng hợp và bạn có thể nhập lớp rừng ngẫu nhiên bằng mã sau:

from sklearn.ensemble nhập khẩu RandomForestClassifier

Bạn có thể tạo một trình phân loại rừng ngẫu nhiên bằng cách sử dụng mã
sau:
rf_model = RandomForestClassifier()

Tuy nhiên, có rất nhiều siêu tham số bạn có thể điều chỉnh cho các mô
hình rừng ngẫu nhiên. Siêu tham số là các tham số bạn xác định trước khi
đào tạo một mô hình máy học. Ví dụ: trong trường hợp thuật toán rừng ngẫu
nhiên , bạn có thể xác định số lượng cây bạn muốn trong mô hình rừng
ngẫu nhiên của mình. Một ví dụ khác, bạn có thể xác định độ sâu tối đa
của mỗi cây trong rừng , để bạn có thể giới hạn mức độ lớn của mỗi cây trong
rừng.

Có rất nhiều siêu tham số mà bạn có thể định nghĩa trong lớp
RandomForestClassifier của scikit-learn. Chúng ta sẽ xem xét một vài ví dụ sau
đây về siêu tham số:

: Điều này xác định số lượng cây bạn muốn xây dựng trong
n_estimators
rừng. Nói chung, nhiều cây hơn có nghĩa là kết quả hiệu suất tốt hơn.
Tuy nhiên, mức tăng hiệu suất cho mỗi cây bổ sung giảm khi số lượng
cây trong rừng tăng lên. Vì có nhiều cây hơn trong rừng có nghĩa là chi
phí tính toán để đào tạo thêm cây, bạn nên cố gắng tìm sự cân bằng và
ngừng thêm cây khi chi phí tính toán từ việc đào tạo thêm cây lớn hơn
mức tăng hiệu suất.
: Tham số này xác định độ sâu tối đa của từng cây riêng lẻ. Độ
max_depth
sâu càng lớn, cây của bạn càng có thể thu thập được nhiều thông tin từ
bộ xe lửa, có nghĩa là những cây lớn hơn học bộ tàu tốt hơn những cây
nhỏ hơn. Tuy nhiên, cây càng lớn thì càng có nhiều khả năng nó sẽ
trang bị quá mức cho bộ tàu. Điều này có nghĩa là cây được đào tạo
hoạt động và dự đoán tốt trong bộ tàu, nhưng dự đoán kém trong tập
dữ liệu mà nó chưa từng thấy trước đây. Để tránh trang bị quá mức,
chúng tôi muốn giới hạn độ sâu của cây đến mức nó không quá phù
hợp với bộ tàu, nhưng dự đoán kết quả đủ tốt. min_samples_split: Điều này
xác định số lượng điểm dữ liệu tối thiểu cần thiết để tách một nút của
cây. Ví dụ: nếu bạn đã xác định min_samples_split là 50, nhưng nút chỉ có 40
bản ghi, thì nó sẽ không tách nút thêm nữa. Mặt khác, nếu nút có nhiều
hơn số lượng mẫu tối thiểu được xác định trước, thì nó sẽ chia nút
thành các nút con. Tương tự như siêu tham số max_depth, điều này
giúp bạn quản lý lượng trang bị quá mức xảy ra trong cây. max_features:
Điều này xác định số lượng tính năng tối đa được xem xét để tách một
nút. Tham số này tạo ra tính ngẫu nhiên trong các mô hình rừng ngẫu
nhiên. Với số lượng tính năng tối đa được xem xét để phân tách, thuật toán
rừng ngẫu nhiên chọn ngẫu nhiên một tập hợp con của các tính năng
lên đến số lượng tối đa và quyết định cách tách một nút nhất định của
cây. Điều này giúp mỗi cây của một mô hình rừng ngẫu nhiên tìm hiểu
thông tin khác nhau từ bộ tàu. Khi những cái cây đã học được bộ tàu
với bộ tính năng hơi khác nhau này được đóng gói hoặc kết hợp tất cả lại
với nhau, thì khu rừng kết quả sẽ trở nên chính xác và mạnh mẽ hơn
trong các dự đoán của nó.

Để biết mô tả chi tiết hơn và thông tin về các siêu tham số khác, bạn có thể
tham khảo tài liệu chính thức của chúng, có thể tìm thấy tại liên kết sau:
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble. RandomForestClassifier.html.
Đào tạo mô hình rừng ngẫu nhiên
Đào tạo một mô hình rừng ngẫu nhiên bằng cách sử dụng scikit-learn rất đơn
giản. Hãy xem đoạn mã sau:
rf_model =
RandomForestClassifier( n_estimators=200,
max_depth=5
)

rf_model.fit(X=x_train, y=y_train)

Sử dụng lớp RandomforestClasifier trong mô-đun ensemble của gói scikit-learn ,


trước tiên bạn cần tạo một đối tượng RandomforestClasifier với các siêu tham số. Để
minh họa, chúng tôi đang hướng dẫn mô hình xây dựng 200 cây , trong đó
mỗi cây chỉ có thể phát triển đến độ sâu 5. Sau đó, bạn có thể đào tạo mô
hình này với hàm fit, lấy hai tham số, X và y, trong đó X dành cho các mẫu
đào tạo và y dành cho nhãn đào tạo hoặc giá trị mục tiêu.

Khi bạn chạy mã này, bạn sẽ thấy một đầu ra trông như sau:
Khi một mô hình rừng ngẫu nhiên được đào tạo hoặc trang bị, đối tượng
mô hình chứa rất nhiều thông tin hữu ích. Một trong những thuộc tính
hữu ích mà bạn có thể trích xuất từ mô hình rừng ngẫu nhiên học scikit được
đào tạo là thông tin về các cây riêng lẻ trong rừng. Bằng cách sử dụng
thuộc tính estimators_, bạn có thể truy xuất từng cây riêng lẻ được xây dựng
trong rừng. Hãy xem kết quả đầu ra sau:

Như bạn có thể thấy từ kết quả này, thuộc tính estimators_ trả về danh sách các
công cụ ước tính phụ, là cây quyết định. Với thông tin này, bạn có thể mô
phỏng những gì mỗi công cụ ước tính phụ này dự đoán cho mỗi đầu vào. Ví
dụ: đoạn mã sau đây cho thấy cách bạn có thể nhận được các dự đoán từ công
cụ ước tính phụ đầu tiên trong nhóm:
rf_model.estimators_[0].predict(x_test)

Kết quả sau đây cho thấy một số dự đoán từ năm công cụ ước tính phụ
đầu tiên:

Như bạn có thể thấy từ kết quả này, các cây khác nhau dự đoán khác nhau
cho mỗi bản ghi của bộ thử nghiệm. Điều này là do mỗi cây được đào tạo
với các tập hợp con khác nhau của các tính năng được chọn ngẫu nhiên.
Chúng ta hãy xem nhanh các dự đoán của các công cụ ước tính phụ riêng
lẻ này. Cây đầu tiên dự đoán kỷ lục thứ 6 trong bộ bài kiểm tra là lớp 1 và
phần còn lại là lớp 0. Mặt khác, cây thứ hai dự đoán rằng 10 bản ghi
đầu tiên của bộ thử nghiệm là lớp 0. Sử dụng thông tin này, bạn có thể thấy
các dự đoán cuối cùng từ mô hình rừng ngẫu nhiên được hình thành như
thế nào từ các công cụ ước tính phụ hoặc cây riêng lẻ này.

Thông tin hữu ích khác mà chúng tôi có thể thu được từ người được đào tạo
Đối tượng RandomForestClassifier là tính năng quan trọng, mà chúng ta có thể
Hiểu tầm quan trọng hoặc tác động của từng tính năng đối với các dự đoán
cuối cùng. Bạn có thể nhận được tầm quan trọng của tính năng cho từng
tính năng bằng cách sử dụng mã sau:
rf_model.feature_importances_

Đầu ra của mã này trông như sau:

Để liên kết các tầm quan trọng của tính năng này với các tính năng tương
ứng, bạn có thể sử dụng mã sau:
feature_importance_df = PD. DataFrame(list(zip(rf_model.feature_importances_, all_features)))
feature_importance_df.columns = ['feature.importance', 'feature']

Kết quả trông như sau:


Như bạn có thể thấy từ kết quả này, tính năng EmploymentStatus.Retired dường
như là yếu tố quan trọng nhất trong việc đưa ra dự đoán cuối cùng và Thu nhập,
Total.Claim.Amount, và Các tính năng Customer.Lifetime.Value tuân theo các tính năng quan
trọng thứ hai , thứ ba và thứ tư .
Đánh giá một mô hình phân loại
Trước đó trong chương này, chúng ta đã thảo luận về năm cách khác nhau để
xem xét hiệu suất của một mô hình phân loại. Trong phần này, chúng ta sẽ
tìm hiểu cách chúng ta có thể tính toán và trực quan hóa các số liệu để đánh
giá mô hình phân loại trong Python bằng cách sử dụng mô hình rừng ngẫu
nhiên mà chúng ta vừa mới xây dựng.

Ba chỉ số đầu tiên mà chúng ta sẽ xem xét là độ chính xác , độ chính xác
và khả năng thu hồi. Gói scikit-learn của Python đã triển khai các hàm cho ba chỉ
số này. Bạn có thể nhập các hàm này bằng dòng mã sau:
từ sklearn.metrics nhập accuracy_score, precision_score, recall_score

Như các bạn có thể thấy từ đoạn code này, module metrics của package scikit-learn
có hàm accuracy_score để tính toán độ chính xác của một model, một hàm
precision_score cho độ chính xác và chức năng recall_score để thu hồi.

Trước khi tiếp tục và đánh giá hiệu suất của mô hình, chúng ta sẽ cần kết
quả dự đoán mô hình. Để có mô hình rừng ngẫu nhiên mà chúng ta đã xây
dựng trong phần trước để đưa ra dự đoán trên tập dữ liệu, chúng ta có thể
chỉ cần sử dụng hàm dự đoán của mô hình. Hãy xem đoạn mã sau:
in_sample_preds = rf_model.predict(x_train)
out_sample_preds = rf_model.predict(x_test)

Với những kết quả dự đoán này, chúng tôi sẽ đánh giá mô hình rừng ngẫu nhiên
của chúng tôi hoạt động tốt như thế nào trong các bộ thử nghiệm và tàu .
Đoạn code sau đây cho thấy cách chúng ta có thể sử dụng các hàm accuracy_score,
precision_score và recall_score trong gói scikit-learn:

# độ chính xác
accuracy_score(thực tế, dự đoán)

# độ chính xác
precision_score(thực tế, dự đoán)
# nhớ lại
recall_score(thực tế, dự đoán)

Như bạn có thể thấy từ mã này, các hàm accuracy_score, precision_score và


recall_score đều có hai tham số — nhãn sự thật và nhãn dự đoán. Hãy xem
kết quả đầu ra sau:
•Độ chính xác , độ chính xác và khả năng thu hồi

from sklearn.metrics import accuracy- score, precision- score , recall score


-

in_sample_preds - rf_model.predict(x_train) out_sample_preds -


rf_model.predict(x_test)

quat( Trong mẫueChính xác: %0.4f Accuracy điểm số(y xe .....


lửa, in mẫue preds))
1 1
\
""" ..... """

in( 0ut-of-mẫu Chính xác: i0.4f' \ Chính xác điểm số (y kiểm tra Ra mẫu preds))
1

..... ..... 1!!!!!!!! Tôi .....

Độ chính xác trong mẫu: O. II4 ·


Độ chính xác ngoài mẫu: 0. 1

hiếmt (1 In-Sample e Độ chính xác: % 0,4f i precisio n score (y train, i n samplee preds))
1

1!!!!!!!! Và" ""l !!!!!!!! Tôi !!!!!!!! Và

quat( 0ut-of-Sample Chính xác: %0.4f Precision điểm.....số(y kiểm.....tra, hoặct mẫue..... preds))
1 1

"""

Độ chính xác trong mẫu: 0. 1


Độ chính xác ngoài mẫu: 0. 4ij

print( In-SampleRecall: i0.4f' \ recall score (y.....train, in sample preds)).....print( 0ut-of-Sample


1 1

..... """

Recall: i0.4f' recall score( y test, out sample preds)) """ ..... 1!!!!!!!! Tôi """

Thu hồi trong mẫu: O.lJll


Thu hồi ngoài mẫu: 0,1Ji4
Đầu ra này cung cấp cho chúng tôi một cái nhìn tổng quan ngắn gọn về hiệu
quả hoạt động của mô hình trong việc dự đoán các phản hồi. Đối với bộ
tàu, độ chính xác của dự đoán tổng thể là 0,8724, có nghĩa là dự đoán mô hình
là chính xác trong khoảng 87% thời gian. Đối với bộ thử nghiệm, độ chính
xác của dự đoán tổng thể là 0,8818, gần như nằm trên cùng một vạch với độ
chính xác dự đoán trong bộ tàu. Bạn cũng có thể thấy rằng độ chính xác
cho các dự đoán trong mẫu và ngoài mẫu lần lượt là 0,9919 và 0,9423, và
các đợt thu hồi là 0,1311 và 0,1324. Do tính ngẫu nhiên và các siêu tham số
khác nhau mà bạn có thể đã sử dụng, bạn có thể nhận được các kết quả khác
nhau.

Bộ số liệu tiếp theo mà chúng ta sẽ xem xét là đường cong ROC và


AUC. Mô-đun số liệu trong gói scikit-learn có các chức năng tiện dụng cho
đường cong ROC và AUC. Hãy xem dòng mã sau:
Từ Sklearn.metrics nhập khẩu roc_curve, AUC

Hàm roc_curve trong mô-đun metrics của gói scikit-learn tính toán ROC và hàm
AUC tính toán AUC. Để tính toán ROC và AUC bằng các hàm này, trước
tiên chúng ta cần lấy xác suất dự đoán từ mô hình rừng ngẫu nhiên của mình.
Đoạn mã sau đây cho thấy cách chúng ta có thể lấy xác suất dự đoán của mô
hình rừng ngẫu nhiên cho cả tàu và bộ thử nghiệm:
in_sample_preds = rf_model.predict_proof(x_train)[:,1]
out_sample_preds = rf_model.predict_proof(x_test)[:,1]

Như các bạn có thể thấy từ code này, chúng ta đang sử dụng hàm predict_proba
của mô hình rừng ngẫu nhiên, rf_model. Hàm này xuất ra xác suất dự đoán của
bản ghi đã cho thuộc về từng lớp. Vì chúng ta chỉ có hai lớp có thể có
trong trường hợp của chúng ta, 0 cho không có phản hồi và 1 cho phản
hồi , đầu ra của hàm predict_proba có hai cột, trong đó cột đầu tiên đại diện
cho xác suất dự đoán của một lớp âm, nghĩa là không có phản hồi cho mỗi
bản ghi và cột thứ hai đại diện cho xác suất dự đoán của một lớp học tích
cực, có nghĩa là một phản hồi cho mỗi hồ sơ. Vì chúng tôi chỉ quan tâm
đến khả năng phản hồi với nỗ lực tiếp thị, chúng tôi có thể lấy cột thứ hai
cho xác suất dự đoán là lớp học tích cực.
Với những xác suất dự đoán này của lớp dương cho cả đoàn tàu và bộ thử
nghiệm, giờ đây chúng ta có thể tính toán đường cong ROC và AUC. Trước
tiên chúng ta hãy xem cách chúng ta có thể tính toán đường cong ROC
bằng cách sử dụng hàm roc_curve trong đoạn mã sau:
in_sample_fpr, in_sample_tpr, in_sample_thresholds = roc_curve(y_train, in_sample_preds)
out_sample_fpr, out_sample_tpr, out_sample_thresholds = roc_curve(y_test, out_sample_preds)

Như bạn có thể thấy từ đoạn mã này, hàm roc_curve có hai tham số — nhãn
quan sát và xác suất dự đoán. Hàm này trả về ba biến, fpr, tpr và ngưỡng. Các
giá trị fpr đại diện cho tỷ lệ dương tính giả cho mỗi ngưỡng nhất định và
các giá trị tpr đại diện cho tỷ lệ dương tính thực cho mỗi ngưỡng nhất
định. Các giá trị ngưỡng đại diện cho các ngưỡng thực tế mà tại đó fpr và
tpr được đo.

Tiếp theo, với các giá trị fpr và tpr này, chúng ta có thể tính AUC bằng cách sử
dụng mã sau:
in_sample_roc_auc = AUC(in_sample_fpr, in_sample_tpr) out_sample_roc_auc =
AUC(out_sample_fpr, out_sample_tpr)

in ('AUC trong mẫu: % 0,4f' % in_sample_roc_auc) in ('AUC mẫu ngoài:


% 0,4f' % out_sample_roc_auc)

Như bạn có thể thấy từ mã này, hàm auc có hai tham số — fpr và tpr. Sử dụng
các giá trị fpr và tpr được tính toán trước đó từ hàm roc_curve, chúng ta có thể dễ
dàng tính toán số AUC cho cả bộ đào tạo và bộ kiểm tra. Đầu ra trông như
sau:
Tùy thuộc vào siêu tham số và tính ngẫu nhiên trong thuật toán rừng
ngẫu nhiên, số AUC của bạn có thể trông khác với các ví dụ này. Tuy
nhiên, trong trường hợp của chúng tôi, bộ tàu trong mẫu AUC là 0,8745
và bộ thử nghiệm ngoài mẫu AUC là 0,8425. Nếu bạn thấy một khoảng
cách lớn giữa hai con số này, đó là dấu hiệu của việc trang bị quá mức và
bạn nên cố gắng giải quyết nó bằng cách cắt tỉa cây trong rừng bằng cách
điều chỉnh các siêu tham số, chẳng hạn như độ sâu tối đa và số lượng mẫu
tối thiểu để tách.

Điều cuối cùng chúng ta sẽ xem xét để đánh giá các mô hình học máy là
đường cong ROC thực tế. Với đầu ra của hàm roc_curve, chúng ta có thể vẽ
các đường cong ROC thực tế bằng cách sử dụng gói matplotlib. Hãy xem đoạn
mã sau:
plt.figure(figsize=(10,7)) plt.plot(
out_sample_fpr, out_sample_tpr, color = 'darkorange', label = 'Đường cong ROC mẫu ngoài (diện tích = % 0,4f)' %
in_sample_roc_auc
)
plt.âm mưu (
in_sample_fpr, in_sample_tpr, color='navy', label='Đường cong ROC trong mẫu (diện tích =
% 0,4f) ' % out_sample_roc_auc
)
plt.plot([0, 1], [0, 1], color='gray', lw=1, linestyle='--') plt.grid()
plt.xlim([0.0, 1.0])
plt.ylim ([0.0, 1.05]) plt.xlabel ('Tỷ lệ dương
tính giả') plt.ylabel ('Tỷ lệ dương tính thực sự' )
plt.title ('Đường cong ROC mô hình RandomForest ')
plt.legend(loc="phía dưới bên phải")

plt.show()

Như bạn có thể thấy từ mã này, chúng tôi đang vẽ ba biểu đồ dòng —
một cho đường cong ROC của bộ thử nghiệm ngoài mẫu, một cho đường
cong ROC trong mẫu và cuối cùng là một cho một đường thẳng cho
điểm chuẩn. Kết quả trông như sau:
Như bạn có thể thấy từ cốt truyện này, sẽ dễ dàng hơn để xem và so sánh
hiệu suất tổng thể của mô hình giữa tàu và bộ thử nghiệm với các đường
cong ROC. Khoảng cách giữa đường cong ROC trong mẫu và đường
cong ROC ngoài mẫu càng lớn, mô hình càng quá phù hợp với bộ tàu và
không khái quát hóa được phát hiện cho dữ liệu không lường trước được.
Mã đầy đủ cho bài tập Python này có thể được tìm thấy tại liên kết sau: https://github.com/y
oonhwang/hands-on-data-science-for-marketing/blob/master/ch.8/python/PredictingEngagement.ipynb
Dự đoán khả năng tương tác tiếp
thị với R
Trong phần này, chúng ta sẽ thảo luận về cách xây dựng các mô hình dự
đoán bằng cách sử dụng các thuật toán học máy trong R. Cụ thể hơn, chúng
ta sẽ học cách xây dựng mô hình dự đoán bằng thuật toán rừng ngẫu
nhiên , cũng như cách điều chỉnh mô hình rừng ngẫu nhiên và đánh giá
hiệu suất của mô hình.
Chúng tôi sẽ chủ yếu sử dụng các gói caTools, ROCR và randomForest để đánh giá,
trực quan hóa và xây dựng các mô hình máy học dự đoán khả năng tương tác
tiếp thị của khách hàng. Đối với những độc giả muốn sử dụng Python thay
vì R cho bài tập này, bạn có thể tham khảo phần trước.

Đối với bài tập này, chúng tôi sẽ sử dụng một trong những bộ dữ liệu có sẵn
công khai từ IBM, có thể được tìm thấy tại liên kết này:
https://www.ibm.com/communities/analy tics / watson-analytics-blog / marketing-customer-value-analysis /. Bạn có thể theo
liên kết này và tải xuống dữ liệu có sẵn ở định dạng CSV , được đặt tên là
WA_Fn UseC_ Phân tích giá trị khách hàng tiếp thị.csv. Khi bạn đã tải xuống dữ liệu này, bạn có
thể tải nó vào RStudio của mình bằng cách chạy lệnh sau:
#### 1. Tải dữ liệu #### df <-
đọc.csv(
file = "~ / Documents / data-science-for-marketing / ch.8 / data / WA_Fn-UseC_-Marketing- Customer-Value-
Analysis.csv",
tiêu đề = TRUE
)

DF trông như sau:


( oMl Wl LLL LLL II ) l!Tôi ,(nm ! J J! 11 tấn
-
Tôi )
lr iji j o ij l l W l ll l l M l oJi j l i j l) ! l! Và loA ijlij'ijl Haste! J m1M n
;Wa oMl Wl LLL I M1 · W! lnl ! J J !l J Mo ( H

Trong J i l Đâu LLL Ll o o Ll J )!I lmm , J J !l J M1 · n


aM1 wa lllW, a all J)!l ij,ornlr ! JJ !l J mm n
- - .
mn l 0 1 wl Illllll o o ll )o ol l mm oJ mrij t
, ml = =

lll , ll J l j ij)!l ij11A r rnmjm ij


m1tôi )!
= -

l W ll l tl l l l i WJ W J Mnm lJ ll J

mj o l Wl
=
!! Ml,o ol ) )! Tôi llA fm
---
ijoJ mm l
wm J ! l Wl llllll J! ) )J Tôi 11A mm 0 J mm
Tôi

ông o ijl Wlllltll Jij l o l l!I ij rnnm ijl !lM m


olỞ = = -

đâu 111, l J lo ) )! Tôi , rn;l , J J! I) mm r


l[rnm
0 mr1 f
lm d l Wl LL / Thẩm Trong ! WoJ ·
IJLL phánJ · -
l!J m mt i
một L
-

-
rll% d l Wl lllnil Jijlo J )! Tôi ijlrnll l! lM mt
iWijl Tôi li ; m!l l iW ijl Wl il! ij'ij!' i lli l ij!l!l li ! JMij) i ij n i l!
'iW!lil!l'liWijli )il!lliWijl ),
Như bạn có thể nhận thấy, đây cũng là tập dữ liệu mà chúng tôi đã sử
dụng trong chương trước, nơi chúng tôi tiến hành phân tích khách hàng.
Với kiến thức chúng ta có được về tập dữ liệu này từ chương trước,
trước tiên chúng ta sẽ chuẩn bị dữ liệu của mình bằng cách mã hóa biến
mục tiêu và các phân loại khác các biến mà chúng ta sẽ sử dụng làm tính
năng cho các mô hình máy học của mình.
Mã hóa biến đổi
Để xây dựng các mô hình học máy trong R, tất cả các tính năng trong tập
dữ liệu cần phải có các giá trị số. Tuy nhiên, trong tập dữ liệu, chúng ta có
nhiều cột có giá trị không phải số. Ví dụ: biến đích, Response, là những gì
chúng ta sẽ cố gắng dự đoán với các mô hình học máy của mình, là không
phải số. Nó chứa hai giá trị chuỗi— Có hoặc Không. Chúng ta sẽ cần mã hóa
biến mục tiêu Response này bằng các giá trị số để có thể xây dựng các mô hình
học máy. Một ví dụ khác, cột Giới tính, mà chúng ta có thể sử dụng làm một
trong những tính năng cho mô hình dự đoán của mình, cũng không có các
giá trị số. Nó chứa hai giá trị chuỗi — F cho nữ và M cho nam. Trong phần
này, chúng ta sẽ thảo luận về cách chúng ta có thể mã hóa các cột không phải
số này, để chúng ta có thể sử dụng chúng làm tính năng trong các mô hình
học máy.
Mã hóa biến phản hồi
Điều đầu tiên chúng ta sẽ làm là encode biến response, Response. Chúng ta sẽ
mã hóa các giá trị Yes với giá trị 1 s và No với 0s. Hãy xem đoạn code sau:
## 2.1. Biến phản hồi: Response df$Engaged <-
as.integer(df$Response) - 1

Như bạn có thể thấy từ mã này, chúng ta chỉ đơn giản là đúc các giá trị
của cột Phản hồi cho các giá trị số nguyên bằng cách sử dụng hàm as.integer. Lý
do tại sao chúng ta trừ đi 1 là vì nó mã hóa các giá trị thành 1 cho Không và
2 cho Có, thay vì 0 cho Không và 1 cho Có, như chúng tôi muốn. Sau đó, chúng
tôi lưu trữ các giá trị được mã hóa này trong một cột mới tạo, Engaged. Để có
được phản hồi tổng thể hoặc tỷ lệ tương tác bằng cách sử dụng cột mới
tạo này, bạn có thể sử dụng mã sau:
trung bình (df $ Tham gia)

Tỷ lệ tương tác tổng thể trông như sau:


Mã hóa biến phân loại
Nếu bạn xem xét kỹ dữ liệu , các cột sau đây là các biến phân loại
trong tập dữ liệu của chúng tôi:
## 2.2. Tính năng phân loạiVars = c(
'Sales.Channel', 'Vehicle.Size', 'Vehicle.Class', 'Policy', 'Policy.Type ', 'EmploymentStatus', 'Marital.Status',
'Education', 'Coverage', 'Gender '
)

Các biến này có một tập hợp các giá trị khác nhau mà chúng có thể lấy
và các giá trị này không nhất thiết phải có các đơn đặt hàng phân biệt cái
này với cái khác.

Nếu bạn nhớ lại từ Chương 4, Từ Tương tác đến Chuyển đổi, chúng tôi đã thảo
luận về cách chúng tôi có thể tạo các biến nhân tố cho các biến phân loại như
vậy trong R. Trong chương này, phương pháp chúng ta sẽ sử dụng là tạo
các biến giả cho từng loại biến phân loại riêng lẻ, sử dụng
hàm model.matrix trong R. Hãy xem đoạn mã sau:
encodedDF <- model.matrix(~.-1, df[categoricalVars])

Như bạn có thể thấy từ mã này, thật đơn giản để tạo các biến giả cho các
biến phân loại trong R. Tất cả những gì bạn cần làm là áp dụng hàm
model.matrix trên các cột biến phân loại của R DataFrame. Nếu bạn nhìn kỹ vào mã,
bạn sẽ nhận thấy công thức ~ .-1 mà chúng tôi đang sử dụng ở đây. Nếu không
có công thức này, hàm model.matrix sẽ tạo ra một cột không cần thiết có tên
Intercept trong ma trận đầu ra. Để tránh có cột không cần thiết này ,
chúng ta có thể sử dụng công thức trong ví dụ mã này. Một vài cột đầu tiên
của DataFrame mới được mã hóaDf bây giờ trông như sau:
Như bạn có thể thấy từ kết quả đầu ra này, mỗi cột của DataFrame mới này đại
diện cho từng danh mục trong cột gốc. Ví dụ: cột đầu tiên, Sales.ChannelAgent,
được mã hóa bằng 1 nếu một đại lý bán hàng liên hệ với bản ghi hoặc khách
hàng đã cho và 0 bản ghi hoặc khách hàng khác. Ví dụ khác, cột thứ năm,
Vehicle.SizeMedsize , được mã hóa bằng 1 nếu bản ghi đã cho hoặc khách hàng có
xe cỡ trung bình và 0 nếu không.

Bây giờ chúng ta đã mã hóa thành công tất cả các biến phân loại với các
giá trị số, chúng ta cần thêm các biến liên tục vào DataFrame mới được tạo
này, được mã hóaDF. Hãy xem đoạn mã sau:
## 2.3. Tính năng liên tục liên
tụcTính năng liên tụcTính năng <-
c(
'Customer.Lifetime.Value', 'Thu nhập', 'Monthly.Premium.Auto', 'Months.Since.Last.Claim',
'Months.Since.Policy.Inception', 'Number.of.Open.Complaints', 'Number.of.Policies', 'Total.Claim.Amount'
)

encodedDF <- cbind(encodedDF, df[continuousFeatures])

Như bạn có thể thấy từ mã này, chúng tôi đang sử dụng hàm cbind R, kết
hợp hai DataFrames theo cột. Chúng tôi đang kết hợp DataFrame encodedDF
đã tạo trước đó, chứa tất cả các biến phân loại được mã hóa với
DataFrame với các biến liên tục. Sau đó, chúng ta đang lưu trữ DataFrame kết
hợp này trở lại biến encodedDF.
Xây dựng mô hình dự đoán
Chúng tôi gần như đã sẵn sàng để bắt đầu xây dựng và đào tạo các mô
hình máy học để dự đoán phản hồi hoặc mức độ tương tác của khách hàng.
Có một điều chúng ta cần làm trước khi bắt đầu đào tạo một mô hình rừng
ngẫu nhiên. Chúng ta cần chia tập mẫu, biến encodedDF, thành hai tập con để
đào tạo các mô hình và một để kiểm tra và đánh giá các mô hình được đào tạo. Gói caTools R
có một chức năng tiện dụng giúp chia một bộ mẫu nhất định thành các bộ
tàu và thử nghiệm. Nếu bạn chưa cài đặt thư viện này trong môi trường R,
bạn có thể cài đặt nó bằng lệnh sau:
install.packages ('caTools')

Bây giờ,hãy xem đoạn mã sau về cách chia bộ mẫu thành đào tạo và
thử nghiệm:
thư viện (caTools)

mẫu <- sample.split(df$Customer, SplitRatio = .7) trainX <-

as.matrix(subset(encodedDF, sample == TRUE))


trainY <- as.double(as.matrix(tập con(df$Engaged, sample == TRUE)))

testX <- as.matrix(tập con(encodedDF, sample == FALSE))


testY <- as.double(as.matrix(tập con(df$Engaged, sample == FALSE)))

Chúng ta hãy xem xét kỹ hơn về mã này. Hàm sample.split trong gói caTools cho
phép chúng ta chia tập dữ liệu thành một tỷ lệ mà chúng ta muốn. Như bạn
có thể thấy từ mã này, chúng tôi đã định nghĩa SplitRatio là 0,7, có nghĩa là
chúng tôi đang lấy 70% tập mẫu làm tập đào tạo và 30% còn lại của bộ mẫu làm bộ
thử nghiệm. Biến kết quả, mẫu, hiện có một mảng giá trị Boolean, TRUE
hoặc FALSE, trong đó 70% mảng là TRUE và 30% còn lại là FALSE.

Với dữ liệu này, chúng ta có thể tạo các đoàn tàu và bộ kiểm tra. Như bạn
có thể thấy từ code, chúng ta đang sử dụng hàm tập con trong R để tạo train và
test sets. Đầu tiên, chúng ta lấy những bản ghi tương ứng với các giá trị
TRUE trong biến mẫu làm tập hợp tàu. Sau đó, chúng tôi lấy những bản ghi
có chỉ mục tương ứng với FALSE
các giá trị trong biến mẫu dưới dạng bộ thử nghiệm. Sau đây cho thấy bảng
phân tích của train và test sets từ bộ mẫu:

Như bạn có thể thấy ở đây, có tổng cộng 9,134 hồ sơ


trong encodedDF, 6.393 bản ghi trong trainX và 2.741 bản ghi trong testX, có nghĩa là
khoảng 70% bộ mẫu đã đi vào bộ tàu và
30% bộ mẫu còn lại đã được đưa vào bộ thử nghiệm. Chúng tôi sẽ sử dụng
các bộ đào tạo và thử nghiệm này để xây dựng và đánh giá các mô hình
trong các phần sau.
Mô hình rừng ngẫu nhiên
Với dữ liệu mà chúng tôi đã chuẩn bị cho đến nay, chúng tôi sẽ xây dựng
một mô hình dự đoán bằng cách sử dụng thuật toán rừng ngẫu nhiên, dự
đoán liệu khách hàng sẽ phản hồi hay tham gia vào chiến dịch tiếp thị.
Chúng ta sẽ sử dụng thư viện randomForest R. Nếu bạn chưa cài đặt thư
viện này trong môi trường R, bạn có thể cài đặt nó bằng lệnh sau :
install.packages ('randomForest')

Khi bạn đã cài đặt gói này, bạn có thể sử dụng mã sau để xây dựng mô
hình rừng ngẫu nhiên:
thư viện (randomForest)

rfModel <- randomForest(x=trainX, y=factor(trainY))

Tuy nhiên, có rất nhiều siêu tham số bạn có thể điều chỉnh cho các mô hình
rừng ngẫu nhiên. Siêu tham số là các tham số bạn xác định trước khi đào
tạo một mô hình máy học. Ví dụ: trong trường hợp thuật toán rừng ngẫu nhiên ,
bạn có thể xác định số lượng cây bạn muốn trong mô hình rừng ngẫu nhiên
của mình. Một ví dụ khác, bạn có thể xác định số lượng nút đầu cuối tối đa cho mỗi
cây trong rừng , để bạn có thể giới hạn kích thước của mỗi cây trong rừng có
thể phát triển.

Có rất nhiều siêu tham số bạn có thể xác định và tinh chỉnh. Chúng ta sẽ
xem xét một vài trong số các siêu tham số sau:

ntree : Điều này xác định số lượng cây bạn muốn xây dựng trong
rừng. Nói chung, nhiều cây hơn có nghĩa là kết quả hiệu suất tốt hơn.
Tuy nhiên, mức tăng hiệu suất cho mỗi cây bổ sung giảm khi số
lượng cây trong rừng tăng lên. Vì có nhiều cây hơn trong rừng có
nghĩa là chi phí tính toán cao hơn để đào tạo thêm cây, bạn nên cố
gắng tìm sự cân bằng và ngừng thêm
cây khi chi phí tính toán từ việc đào tạo thêm cây lớn hơn mức
tăng hiệu suất.
sampsize: Tham số này xác định kích thước của mẫu cần vẽ để huấn
luyện từng cây. Điều này giới thiệu tính ngẫu nhiên trong rừng, đồng
thời đào tạo một mô hình rừng ngẫu nhiên. Có kích thước mẫu cao dẫn
đến một khu rừng ít ngẫu nhiên hơn và có cơ hội trang bị quá mức cao
hơn. Điều này có nghĩa là cây được đào tạo hoạt động và dự đoán tốt
trong bộ tàu, nhưng dự đoán kém trong tập dữ liệu mà nó chưa từng
thấy trước đây. Giảm kích thước mẫu có thể giúp bạn tránh bị quá tải,
nhưng hiệu suất của mô hình của bạn thường giảm khi bạn giảm kích
thước mẫu. nodesize: Tham số này xác định kích thước tối thiểu
của các nút đầu cuối , có nghĩa là ít nhất mỗi nút đầu cuối cần có bao
nhiêu mẫu . Con số này càng lớn, cây có thể phát triển càng nhỏ. Khi
bạn tăng con số này, bạn có thể giảm thiểu các vấn đề về trang bị quá
mức, nhưng phải trả giá bằng hiệu suất của mô hình. maxnodes:
Tham số này xác định số lượng nút đầu cuối tối đa mà mỗi cây trong
rừng có thể có. Nếu bạn không đặt con số này, thuật toán sẽ phát triển
cây một cách đầy đủ nhất. Điều này có thể dẫn đến việc trang bị quá
nhiều bộ tàu. Giảm số lượng nút đầu cuối tối đa có thể giúp bạn khắc
phục các vấn đề về trang bị quá mức.

Để biết mô tả chi tiết hơn và thông tin về các siêu tham số khác, bạn có thể
tham khảo tài liệu chính thức có thể được tìm thấy tại liên kết sau:
https://www.rdocumentation.org/packages/randomForest/versions/4.6-1 4 / chủ đề / randomForest.
Đào tạo mô hình rừng ngẫu nhiên
Đào tạo một mô hình rừng ngẫu nhiên bằng gói randomForest rất đơn giản.
Hãy xem đoạn mã sau:
rfModel <- randomForest(x=trainX, y=factor(trainY), ntree=200, maxnodes=24)

Sử dụng hàm randomForest trong gói randomForest, bạn có thể dễ dàng


đào tạo một mô hình rừng ngẫu nhiên. Bạn chỉ cần cung cấp bộ tàu cho
chức năng. Để minh họa, chúng tôi đang hướng dẫn mô hình xây dựng
200 cây , trong đó mỗi cây chỉ có thể phát triển tối đa 24 nút đầu cuối.

Khi các bạn chạy code này, đối tượng model của các bạn sẽ trông như sau:
Khi một mô hình rừng ngẫu nhiên được đào tạo hoặc trang bị, đối tượng
mô hình chứa rất nhiều thông tin hữu ích. Một trong những thuộc tính hữu
ích mà bạn có thể trích xuất từ mô hình rừng ngẫu nhiên được đào tạo là
thông tin về từng cây trong rừng. Sử dụng hàm getTree, bạn có thể truy xuất
cách các cây riêng lẻ được xây dựng trong rừng. Hãy xem ví dụ sau:
Ở đây chúng tôi đang xem xét thông tin về cây đầu tiên trong rừng. Điều
này cung cấp cho chúng tôi một số thông tin về cấu trúc của cây. Các cột con
gái bên trái và con gái bên phải cho chúng ta biết vị trí của nút này trong cây đã
cho. Cột trạng thái cho chúng ta biết nút có phải là thiết bị đầu cuối (- 1) hay
không (1). Cột dự đoán cho chúng ta biết dự đoán từ nút này.

Thông tin khác mà chúng ta có thể nhận được từ mô hình rừng ngẫu
nhiên được trang bị là dự đoán từ mỗi cây trong rừng. Hãy xem đoạn
mã sau:
dự đoán(rfModel, trainX, predict.all=TRUE)

Bằng cách sử dụng cờ predict.all=TRUE, hàm prediction trả về các dự đoán từ mỗi cây
trong rừng. Hãy xem kết quả đầu ra sau:
Kết quả này đang hiển thị dự đoán của 20 cây đầu tiên cho năm kỷ lục
đầu tiên trong bộ tàu. Như bạn có thể thấy từ kết quả này, cây thứ 10 trong
rừng đã dự đoán kỷ lục thứ 5 trong đoàn tàu được thiết lập là hạng 1, nhưng tất
cả 19 cây còn lại dự đoán kỷ lục thứ 5 trong đoàn tàu được thiết lập là hạng
0. Như bạn có thể thấy từ kết quả này, các cây khác nhau dự đoán khác
nhau cho mỗi bản ghi của bộ thử nghiệm. Điều này là do mỗi cây được
đào tạo với các tập hợp con khác nhau của các tính năng được chọn ngẫu
nhiên. Sử dụng thông tin này, bạn có thể thấy cách các dự đoán cuối cùng từ
mô hình rừng ngẫu nhiên được hình thành từ các công cụ ước tính phụ hoặc
cây riêng lẻ này.

Thông tin hữu ích khác mà chúng ta có thể thu được từ một đối tượng ngẫu
nhiênForest được đào tạo là tầm quan trọng của tính năng, nhờ đó chúng ta có
thể hiểu tầm quan trọng hoặc tác động của từng tính năng đối với những dự
đoán cuối cùng. Bạn có thể nhận được tầm quan trọng của tính năng cho từng
tính năng bằng cách sử dụng mã sau:
# - Tầm quan trọng của tính
năng (rfModel)

Một phần đầu ra của mã này trông như sau:


Như bạn có thể thấy từ kết quả này, tính năng EmploymentStatusRetired dường
như là yếu tố quan trọng nhất trong việc đưa ra dự đoán cuối cùng và
Các tính năng Thu nhập, Total.Claim.Amount và Customer.Lifetime.Value tuân theo các tính năng
quan trọng thứ hai, thứ ba và thứ tư .
Đánh giá một mô hình phân loại
Trước đó trong chương này, chúng ta đã thảo luận về năm cách khác nhau để
xem xét hiệu suất của một mô hình phân loại. Trong phần này, chúng ta sẽ
tìm hiểu cách chúng ta có thể tính toán và trực quan hóa các số liệu để đánh
giá một mô hình phân loại trong R bằng cách sử dụng mô hình rừng ngẫu
nhiên mà chúng ta vừa mới xây dựng.

Ba chỉ số đầu tiên mà chúng ta sẽ xem xét là độ chính xác , độ chính xác
và khả năng thu hồi. Trước khi tiếp tục và đánh giá hiệu suất của mô hình,
chúng ta sẽ cần kết quả dự đoán mô hình. Để mô hình rừng ngẫu nhiên mà
chúng ta đã xây dựng trong phần trước đưa ra dự đoán trên tập dữ liệu,
chúng ta có thể chỉ cần sử dụng hàm dự đoán . Hãy xem đoạn mã sau:
inSamplePreds <- as.double(predict(rfModel, trainX)) - 1 outSamplePreds < -
as.double(predict(rfModel, testX)) - 1

Với những kết quả dự đoán này, chúng tôi sẽ đánh giá mô hình rừng ngẫu
nhiên của chúng tôi hoạt động tốt như thế nào trong các bộ thử nghiệm và
tàu . Đoạn mã sau đây cho thấy cách chúng ta có thể tính toán độ chính xác
, độ chính xác và khả năng thu hồi trong R:
# - Độ chính xác
độ chính xác <- trung bình (testY == outSamplePreds)

# - Độ chính xác
độ chính xác <- sum (outSamplePreds & testY) / sum (outSamplePreds)
# - Nhớ lại
thu hồi <- sum (outSamplePreds & testY) / sum (testY)

Sử dụng phương pháp này, chúng ta có thể so sánh độ chính xác, độ chính xác và
khả năng thu hồi của bộ tàu trong mẫu với độ chính xác, độ chính xác và khả năng nhớ lại của
bộ thử nghiệm ngoài mẫu.
Hãy xem kết quả đầu ra sau:
Đầu ra này cung cấp cho chúng tôi một cái nhìn tổng quan ngắn gọn về
hiệu quả hoạt động của mô hình trong việc dự đoán các phản hồi. Đối
với bộ tàu, độ chính xác của dự đoán tổng thể là 0,8756, có nghĩa là dự
đoán mô hình là chính xác cho
khoảng 88% thời gian. Đối với bộ thử nghiệm, độ chính xác của dự đoán
tổng thể là 0,8636. Bạn cũng có thể thấy rằng độ chính xác cho các dự đoán
trong mẫu và ngoài mẫu lần lượt là 0,9717 và 0,8980, và các lần thu hồi
là 0,1151 và 0,1065. Do tính ngẫu nhiên và các siêu tham số khác nhau mà
bạn có thể đã sử dụng, bạn có thể nhận được các kết quả khác nhau.

Bộ số liệu tiếp theo mà chúng ta sẽ xem xét là đường cong ROC và


AUC. Chúng tôi sẽ sử dụng gói ROCR R. Nếu bạn chưa cài đặt gói
này trong môi trường R của mình, bạn có thể cài đặt nó bằng lệnh sau:
install.packages ('ROCR')

Trước tiên , hãy xem mã sau cho đường cong ROC và số AUC:
thư viện (ROCR)

inSamplePredProbs <- as.double(predict(rfModel, trainX, type='prob')[,2]) outSamplePredProbs <-


as.double(predict(rfModel, testX, type='prob')[,2])

pred <- dự đoán (outSamplePredProbs, testY)


perf <- hiệu suất (pred, đo lường = "tpr", x.measure = "fpr") auc <- hiệu suất
(pred , measure = 'auc') @y.values [[1]]

Cốt truyện(
Perf
main = sprintf ('Đường cong ROC mô hình rừng ngẫu nhiên (AUC: % 0,2f)', auc), col =
'darkorange',
lwd = 2
) + lưới()
abline(a = 0, b = 1, col = 'darkgray', lty = 3, lwd = 2)

Điều đầu tiên chúng ta cần làm là lấy xác suất dự đoán từ mô hình mà
chúng ta đã xây dựng. Sử dụng hàm dự đoán và cờ type='prob', chúng ta có
thể lấy xác suất dự đoán từ mô hình rừng ngẫu nhiên. Sau đó, chúng tôi đang
sử dụng hàm dự đoán trong gói ROCR. Hàm này tính toán số lượng dương
tính thật và dương tính giả ở các mức cắt xác suất khác nhau mà chúng ta
cần cho đường cong ROC. Sử dụng đầu ra của hàm dự đoán, sau đó chúng ta
có thể nhận được tỷ lệ dương tính thực và tỷ lệ dương tính giả ở các mức
cắt xác suất khác nhau với hàm hiệu suất trong gói ROCR. Cuối cùng, để có
được số AUC, chúng ta có thể sử dụng cùng một hàm hiệu suất với một lá cờ
khác, measure = 'auc'.

Với dữ liệu này, giờ đây chúng ta có thể vẽ đường cong ROC. Sử dụng hàm
plot và biến perf, là đầu ra của hàm performance, chúng ta có thể vẽ đường cong
ROC. Cốt truyện trông như sau:
Như bạn có thể thấy từ cốt truyện này, AUC của mô hình rừng ngẫu nhiên
của chúng tôi là 0,76. So với đường thẳng chuẩn, đại diện cho đường
ngẫu nhiên, mô hình hoạt động tốt hơn nhiều và điều này cho thấy các dự
đoán mô hình tốt hơn nhiều so với dự đoán ngẫu nhiên.
Mã đầy đủ cho bài tập R này có thể được tìm thấy tại liên kết sau: https://github.com/yoonhwan

g/hands-on-data-science-for-marketing/blob/master/ch.8/R/PredictingEngagement.R.
Tóm tắt
Trong chương này, chúng ta đã thảo luận về phân tích dự đoán và các ứng
dụng của nó trong tiếp thị. Trước tiên, chúng tôi đã thảo luận về phân tích
dự đoán là gì và cách nó được sử dụng trong nhiều ngành khác, chẳng hạn
như trong các ngành tài chính và chăm sóc sức khỏe. Sau đó, chúng tôi đã
thảo luận về bốn trường hợp sử dụng phổ biến của phân tích dự đoán trong
tiếp thị — khả năng tương tác, giá trị lâu dài của khách hàng, đề xuất các sản
phẩm và nội dung phù hợp cũng như thu hút và giữ chân khách hàng. Có thể
có nhiều trường hợp sử dụng phân tích dự đoán khác trong tiếp thị, vì vậy chúng
tôi khuyên bạn nên cập nhật những tin tức mới nhất về cách phân tích dự
đoán có thể được sử dụng trong các ngành tiếp thị. Sau đó, chúng tôi đã
thảo luận về năm cách khác nhau để đánh giá hiệu suất của các mô hình dự
đoán - độ chính xác, độ chính xác, khả năng nhớ lại, đường cong ROC và
AUC.

Trong chương tiếp theo, chúng ta sẽ mở rộng kiến thức về phân tích dự
đoán. Chúng ta sẽ thảo luận về khái niệm và tầm quan trọng của việc đo
lường giá trị trọn đời của khách hàng , cũng như xây dựng các mô hình máy học để
dự đoán giá trị trọn đời của khách hàng.

You might also like