Các kỹ thuật học máy để ước tính tuổi của người dùng dựa trên các trang Facebook mà họ thích


25

Tôi có một cơ sở dữ liệu từ ứng dụng Facebook của mình và tôi đang cố gắng sử dụng máy học để ước tính tuổi của người dùng dựa trên những trang Facebook họ thích.

Có ba đặc điểm quan trọng của cơ sở dữ liệu của tôi:

  • phân phối độ tuổi trong tập huấn luyện của tôi (tổng cộng 12 nghìn người dùng) bị lệch về phía người dùng trẻ (ví dụ: tôi có 1157 người dùng ở độ tuổi 27 và 23 người dùng ở độ tuổi 65);

  • nhiều trang web có không quá 5 lượt thích (tôi đã lọc ra các trang FB có ít hơn 5 lượt thích).

  • có nhiều tính năng hơn mẫu.

Vì vậy, câu hỏi của tôi là: bạn muốn đề xuất chiến lược gì để chuẩn bị dữ liệu để phân tích sâu hơn? Tôi có nên thực hiện một số loại giảm kích thước? Phương pháp ML nào sẽ thích hợp nhất để sử dụng trong trường hợp này?

Tôi chủ yếu sử dụng Python, vì vậy gợi ý dành riêng cho Python sẽ được đánh giá rất cao.


1
Khi bạn nói "nhiều tính năng hơn mẫu" Tôi giả sử bạn có nghĩa là số lượng trang web thích duy nhất là >> người dùng num. Có phải đó cũng là trường hợp cho tên miền gốc của các trang web? tức là họ có một số url youtube.com hoặc cnn.com trong các trang web hoặc họ đã bắt nguồn từ tên miền? Tôi đang nghiêng về việc giảm kích thước bằng cách thu gọn URL vào gốc tên miền thay vì các trang cụ thể nếu có thể.
cwharland

Cảm ơn về câu trả lời. Số lượng tính năng (trang web thích duy nhất) là 32k, trong khi số lượng mẫu (người dùng) là 12k. Các tính năng là Trang Facebook, do đó không cần phải đặt URL. Một người dùng có thể thích facebook.com/cnn hoặc không. Tuy nhiên, tôi thích ý tưởng cố gắng ước tính tuổi của người dùng dựa trên các liên kết họ chia sẻ :)
Wojciech Walczak

Ahhh, tôi đọc sai các mô tả trang web thích. Cảm ơn bạn đã làm rõ.
cwharland

Câu trả lời:


16

Một điều để bắt đầu với sẽ là k-NN. Ý tưởng ở đây là bạn có một ma trận người dùng / vật phẩm và đối với một số người dùng bạn có tuổi được báo cáo. Độ tuổi của một người trong ma trận mục người dùng có thể được xác định rõ bằng một số thứ như tuổi trung bình hoặc trung bình của một số hàng xóm gần nhất trong không gian vật phẩm.

Vì vậy, bạn có mỗi người dùng được biểu thị dưới dạng một vectơ trong không gian vật phẩm, tìm k hàng xóm gần nhất và gán vectơ trong câu hỏi một số chỉ số tóm tắt về độ tuổi hàng xóm gần nhất. Bạn có thể chọn k trên một khoảng cách cắt hoặc thực tế hơn bằng cách lặp đi lặp lại độ tuổi cho một chuyến tàu và chọn k giảm thiểu lỗi trong bài tập đó.

Nếu thứ nguyên là một vấn đề, bạn có thể dễ dàng thực hiện giảm trong thiết lập này bằng cách phân tách giá trị đơn lẻ chọn các vectơ m thu được nhiều phương sai nhất trong nhóm.

Trong mọi trường hợp vì mỗi tính năng là nhị phân, có vẻ như độ tương tự cosine sẽ là số liệu khoảng cách của bạn.

Tôi cần suy nghĩ thêm một chút về các cách tiếp cận khác (hồi quy, rf, v.v.) với trọng tâm hẹp của không gian tính năng của bạn (tất cả các biến thể của cùng một hành động, theo ý tôi) Tôi nghĩ cách tiếp cận người dùng / vật phẩm có thể là tốt nhất.

Một lưu ý cần thận trọng, nếu độ tuổi bạn đi tàu được tự báo cáo, bạn có thể cần phải sửa một số trong số chúng. Mọi người trên facebook có xu hướng báo cáo độ tuổi trong thập kỷ họ được sinh ra. Vẽ một biểu đồ về ngày sinh (bắt nguồn từ lứa tuổi) và xem bạn có tăng đột biến ở các thập kỷ như thập niên 70, 80, 90 không.


Xin chào, câu trả lời của bạn khá giống với chiến lược thực tế của tôi. Tôi đã sử dụng sklearn.neighbors.KNeighborsRegressorvới số liệu cosine trên không gian giảm SVD (sau khi áp dụng SVD, lỗi ước tính trung bình giảm từ ~ 6 năm xuống ~ 4). Người dùng trong cơ sở dữ liệu của tôi ở độ tuổi 18-65 (người dùng lớn tuổi hơn đã được lọc), vì vậy có 48 lớp có thể. Tôi tự hỏi liệu đó không phải là quá nhiều lớp cho kNN, và liệu tôi nên coi nó là hồi quy hay một vấn đề phân loại (tôi nghĩ cả hai đều có thể áp dụng được).
Wojciech Walczak

Tôi có thể nói, theo giai thoại, tôi đã sử dụng mỗi Rừng ngẫu nhiên để phù hợp với một số lớp riêng lẻ sau đó kết hợp kết quả của từng mô hình đó theo nhiều cách khác nhau. Trong trường hợp này, bạn thậm chí có thể nghĩ về việc gán xác suất trước cho từng độ tuổi của người dùng với kNN, sau đó chạy qua từng mô hình dựa trên lớp, sử dụng các điểm số đó để cập nhật xác suất trước cho mỗi lớp và chọn lớp có thể xảy ra nhất từ ​​các hậu thế đó. Nghe có vẻ phức tạp hơn một chút nhưng tệ nhất là bạn sẽ có độ chính xác kNN.
cwharland

7

Gần đây tôi đã thực hiện một dự án tương tự trong Python (dự đoán ý kiến ​​sử dụng dữ liệu như FB) và đã có kết quả tốt với quy trình cơ bản sau:

  1. Đọc trong tập huấn luyện (n = N) bằng cách lặp qua phân tách bằng dấu phẩy như các bản ghi từng dòng và sử dụng bộ đếm để xác định các trang phổ biến nhất
  2. Đối với mỗi trang K phổ biến nhất (tôi đã sử dụng khoảng 5000, nhưng bạn có thể chơi xung quanh với các giá trị khác nhau), hãy sử dụng pandas.DataFrame.isin để kiểm tra xem mỗi cá nhân trong tập huấn luyện có thích từng trang không, sau đó tạo một khung dữ liệu N x K kết quả (tôi sẽ gọi nó là xdata_train)
  3. Tạo một chuỗi (tôi sẽ gọi nó là ydata_train) chứa tất cả các biến kết quả (theo ý kiến ​​của tôi, trong độ tuổi của bạn) với cùng chỉ mục là xdata_train
  4. Thiết lập trình phân loại rừng ngẫu nhiên thông qua scikit-learn để dự đoán ydata_train dựa trên xdata_train
  5. Sử dụng thử nghiệm xác thực chéo của scikit-learn để điều chỉnh các tham số và tinh chỉnh độ chính xác (điều chỉnh số lượng trang phổ biến, số lượng cây, kích thước lá tối thiểu, v.v.)
  6. Xuất phân loại rừng ngẫu nhiên và danh sách các trang phổ biến nhất với dưa chua (hoặc giữ trong bộ nhớ nếu bạn đang làm mọi thứ cùng một lúc)
  7. Tải phần còn lại của dữ liệu của bạn, tải danh sách các trang phổ biến (nếu cần) và lặp lại bước 2 để tạo xdata_new
  8. Tải trình phân loại rừng ngẫu nhiên (nếu cần) và sử dụng nó để dự đoán các giá trị cho dữ liệu xdata_new
  9. Xuất điểm số dự đoán sang CSV mới hoặc định dạng đầu ra khác mà bạn chọn

Trong trường hợp của bạn, bạn cần trao đổi bộ phân loại cho một bộ hồi quy (vì vậy hãy xem tại đây: http://scikit-learn.org/ sóng / modules / generic / sklearn.ensemble.RandomForestRegressor.html ) nhưng nếu không thì cùng một quy trình Nên làm việc mà không gặp nhiều rắc rối.

Ngoài ra, bạn nên biết về tính năng tuyệt vời nhất của các khu rừng ngẫu nhiên trong Python: song song hóa ngay lập tức! Những người trong chúng ta bắt đầu làm việc này trong R và sau đó chuyển sang luôn luôn ngạc nhiên, đặc biệt là khi bạn làm việc trên một máy có vài chục lõi (xem tại đây: http://blog.yhathq.com/posts/compared- Random-Forest-in-python-and-r.html ).

Cuối cùng, lưu ý rằng đây sẽ là một ứng dụng hoàn hảo để phân tích mạng nếu bạn có dữ liệu về bạn bè cũng như bản thân các cá nhân. Nếu bạn có thể phân tích độ tuổi của bạn bè người dùng, độ tuổi của người dùng gần như chắc chắn sẽ trong vòng một hoặc hai năm giữa những người bạn của họ, đặc biệt nếu người dùng đủ trẻ để xây dựng mạng lưới bạn bè của họ khi còn ở trường học (vì hầu hết sẽ là bạn cùng lớp). Dự đoán đó có khả năng sẽ thổi phồng bất kỳ điều gì bạn sẽ nhận được từ mô hình --- đây là một ví dụ trong sách giáo khoa về một vấn đề trong đó dữ liệu đúng> mô hình phù hợp mọi lúc.

Chúc may mắn!


2
Một khía cạnh thú vị của việc sử dụng 5000 trang web hàng đầu là thực tế rằng họ có thể không giỏi trong việc phân khúc người dùng theo độ tuổi. Các trang web hàng đầu, bằng cách xây dựng, là những trang web mà tất cả mọi người truy cập. Do đó, họ không giỏi trong việc phân khúc người dùng của bạn vì tất cả các phân loại (độ tuổi) có thể đã tham gia với các trang web đó. Đây là một khái niệm tương tự như phần idf của tf-idf. idf giúp lọc tiếng ồn "mọi người đều có tính năng này". Làm thế nào để các trang web được truy cập nhiều nhất xếp hạng là các tính năng trong các ô quan trọng khác nhau với RF của bạn?
cwharland

1
Điểm tốt. Một cách khắc phục dễ dàng cho việc này là phân tầng tập dữ liệu huấn luyện thành các thùng tuổi J (ví dụ: 13-16, 17-20, 21-24, v.v.) và lấy các trang (K / J) hàng đầu cho mỗi nhóm. Điều đó sẽ đảm bảo bạn có đại diện đáng kể cho mỗi nhóm. Chắc chắn sẽ có một số chồng chéo giữa các nhóm, vì vậy nếu bạn thực sự kén chọn, bạn có thể muốn lấy các trang duy nhất (K / J) cho mỗi nhóm, nhưng tôi nghĩ rằng điều đó có thể là quá mức cần thiết.
Therriault

5

Một đề nghị khác là kiểm tra hồi quy logistic . Là một phần thưởng bổ sung, các trọng số (hệ số) của mô hình sẽ cho bạn ý tưởng về các trang web phân biệt tuổi tác.

Sklearn cung cấp gói sklearn.linear_model.LogisticRegression được thiết kế để xử lý dữ liệu thưa thớt.

Như đã đề cập trong các ý kiến, trong trường hợp hiện tại, với nhiều biến đầu vào hơn các mẫu, bạn cần thường xuyên hóa mô hình (với sklearn.linear_model.LogisticRegression sử dụng penalty='l1'đối số).


1
Với LR, bạn sẽ phải tạo ra nhiều mô hình cho các thùng tuổi. Làm thế nào để so sánh hai mô hình cho các thùng tuổi khác nhau dự đoán cùng một thăm dò về sự bao gồm cho người dùng?
cwharland

1
Lưu ý rằng LR thất bại khi có nhiều biến hơn các quan sát và hoạt động kém nếu các giả định của mô hình không được đáp ứng. Để sử dụng nó, giảm kích thước phải là bước đầu tiên.
Christopher Louden

1
@cwharland bạn không nên coi biến trả lời là phân loại vì nó liên tục theo bản chất và bị rời rạc bởi định nghĩa vấn đề. Xem xét nó phân loại có nghĩa là nói với thuật toán dự đoán tuổi 16 khi nó thực sự là 17 là một lỗi nghiêm trọng như dự đoán 30 khi nó thực sự là 17. Xem xét nó liên tục đảm bảo rằng các lỗi nhỏ (16 so với 17) được coi là lỗi nhỏ và lớn ( 30 so với 17) được coi là lớn. Hồi quy logistic được sử dụng trong trường hợp này để dự đoán giá trị liên tục và không ước tính xác suất sau.
damienfrancois

@ChristopherLouden Bạn nói đúng rằng phiên bản vanilla của hồi quy logistic không phù hợp với trường hợp 'p lớn n nhỏ', tôi nên đề cập rằng chính quy hóa là quan trọng trong trường hợp hiện tại. Tôi cập nhật câu trả lời của tôi. Nhưng LR được chuẩn hóa L1 là một loại lựa chọn tính năng nên tôi cho rằng không cần bước FS sơ bộ.
damienfrancois

@damienfrancois: Tôi chắc chắn đồng ý. Tôi chỉ lo ngại một chút rằng trong trường hợp này, LR sẽ xử phạt các giá trị trung gian quá khắc nghiệt. Dường như không có động lực để ánh xạ tới một đường cong giống như hình sigma cho rằng bạn không đặc biệt quan tâm đến các giá trị cực kỳ tuổi tác. Có lẽ tôi đang hiểu sai về việc sử dụng mặc dù.
cwharland

4

Một số nghiên cứu từ D. Nguyen et al. cố gắng dự đoán tuổi của người dùng twitter dựa trên tweet của họ. Có lẽ bạn thấy chúng hữu ích. Họ sử dụng hồi quy logistic và tuyến tính.


3

Ngoài các phương pháp fancier, bạn có thể thử công thức Bayes

P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))

P (I | p1 ... pn) là xác suất người dùng thuộc nhóm tuổi I nếu anh ta thích p1, .., pn

P (i) là xác suất người dùng thuộc nhóm tuổi i

P (p1 .. pn | i) là xác suất mà người dùng thích p1, .., pn nếu anh ta thuộc nhóm tuổi i.

  • Bạn đã có ước tính cho P (i) từ dữ liệu của mình: đây chỉ là tỷ lệ người dùng trong nhóm tuổi I.
  • Để ước tính P (p1 ... pn | i), với mỗi nhóm tuổi tôi ước tính xác suất (tần suất) p_ij giống như một trang j. Để có p_ij khác không cho tất cả j, bạn có thể trộn tần số cho toàn bộ dân số với một trọng lượng nhỏ.

  • Sau đó đăng nhập P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), tổng trên tất cả các trang mà người dùng mới thích. Công thức này sẽ gần đúng với giả định rằng người dùng thích các trang trong nhóm tuổi của mình một cách độc lập.

  • Về mặt lý thuyết, bạn cũng nên thêm nhật ký (1-p_ij) cho tất cả i mà anh ấy không thích, nhưng trong thực tế, bạn sẽ thấy rằng tổng số nhật ký (1-p_ij) sẽ nhỏ một cách không liên quan, vì vậy bạn cũng không cần nhiều bộ nhớ.

Nếu bạn hoặc ai đó đã thử điều này, xin vui lòng bình luận về kết quả.


2

Đây là một vấn đề rất thú vị.

Tôi đã đối mặt với một cái tương tự bằng cách phân tích những hình ảnh người dùng tải lên mạng xã hội. Tôi đã làm theo cách tiếp cận sau:

  • Thay vì liên kết dữ liệu với các độ tuổi (15 yo, 27 yo, ...) những gì tôi đã làm là thiết lập các nhóm tuổi khác nhau: Dưới 18, từ 18 đến 30 và lớn hơn 30 (điều này là do vấn đề cụ thể chúng tôi gặp phải phải đối mặt, nhưng bạn có thể chọn bất kỳ khoảng thời gian nào bạn muốn). Bộ phận này giúp rất nhiều để giải quyết vấn đề.
  • Sau đó, tôi đã tạo một cụm phân cấp (chia hoặc tổng hợp). Sau đó, tôi chọn những nhánh mà tôi có người dùng có độ tuổi đã biết (hoặc tuổi nhóm) và sau đó với nhánh đó tôi đã mở rộng cùng độ tuổi với nhóm đó.

Cách tiếp cận này là học bán giám sát và tôi khuyên bạn nên sử dụng trong trường hợp bạn chỉ có một số dữ liệu được dán nhãn.

Xin lưu ý rằng trên mạng xã hội, mọi người thường nói dối về độ tuổi (chỉ để giải trí hoặc đôi khi vì họ muốn tự quay phim trên mạng xã hội).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.