SNA Hackathon 2019

Vào tháng 2019-tháng XNUMX năm XNUMX, một cuộc thi đã được tổ chức để xếp hạng nguồn cấp dữ liệu mạng xã hội SNA Hackathon 2019, trong đó đội của chúng tôi đã giành vị trí đầu tiên. Trong bài viết, tôi sẽ nói về việc tổ chức cuộc thi, các phương pháp chúng tôi đã thử và cài đặt catboost để đào tạo về dữ liệu lớn.

SNA Hackathon 2019

Cuộc thi hack SNA

Đây là lần thứ ba một cuộc thi hackathon mang tên này được tổ chức. Nó được tổ chức bởi mạng xã hội ok.ru, tương ứng, nhiệm vụ và dữ liệu đều liên quan trực tiếp đến mạng xã hội này.
SNA (phân tích mạng xã hội) trong trường hợp này được hiểu chính xác hơn không phải là phân tích biểu đồ xã hội, mà là phân tích mạng xã hội.

  • Vào năm 2014, nhiệm vụ là dự đoán số lượt thích mà một bài đăng sẽ nhận được.
  • Năm 2016 - nhiệm vụ VVZ (có thể bạn đã quen), gần hơn với việc phân tích biểu đồ xã hội.
  • Năm 2019, xếp hạng nguồn cấp dữ liệu của người dùng dựa trên khả năng người dùng sẽ thích bài đăng.

Tôi không thể nói về năm 2014, nhưng trong năm 2016 và 2019, ngoài khả năng phân tích dữ liệu, kỹ năng làm việc với dữ liệu lớn cũng được yêu cầu. Tôi nghĩ chính sự kết hợp giữa học máy và các vấn đề xử lý dữ liệu lớn đã thu hút tôi đến với những cuộc thi này và kinh nghiệm của tôi trong các lĩnh vực này đã giúp tôi giành chiến thắng.

mlbootcamp

Năm 2019, cuộc thi được tổ chức trên nền tảng https://mlbootcamp.ru.

Cuộc thi bắt đầu trực tuyến vào ngày 7/3 và bao gồm XNUMX nhiệm vụ. Bất cứ ai cũng có thể đăng ký trên trang web, tải về cơ sở và tải xe của bạn trong một vài giờ. Khi kết thúc giai đoạn trực tuyến vào ngày 15 tháng 15, 30 người đứng đầu của mỗi sự kiện nhảy show đã được mời đến văn phòng Mail.ru để tham gia giai đoạn ngoại tuyến, diễn ra từ ngày 1 tháng XNUMX đến ngày XNUMX tháng XNUMX.

Nhiệm vụ

Dữ liệu nguồn cung cấp ID người dùng (userId) và ID bài đăng (objectId). Nếu người dùng được xem một bài đăng thì dữ liệu sẽ chứa một dòng chứa userId, objectId, phản ứng của người dùng đối với bài đăng này (phản hồi) và một tập hợp các tính năng hoặc liên kết khác nhau tới hình ảnh và văn bản.

tên người dùng ID đối tượng id chủ sở hữu thông tin phản hồi hình ảnh
3555 22 5677 [thích, đã nhấp] [băm1]
12842 55 32144 [không thích] [hash2,hash3]
13145 35 5677 [đã nhấp, chia sẻ] [băm2]

Tập dữ liệu thử nghiệm có cấu trúc tương tự nhưng thiếu trường phản hồi. Nhiệm vụ là dự đoán sự hiện diện của phản ứng 'thích' trong trường phản hồi.
File gửi có cấu trúc như sau:

tên người dùng Danh sách được sắp xếp[objectId]
123 78,13,54,22
128 35,61,55
131 35,68,129,11

Số liệu này là ROC AUC trung bình cho người dùng.

Một mô tả chi tiết hơn về dữ liệu có thể được tìm thấy tại trang web của hội đồng. Bạn cũng có thể tải xuống dữ liệu ở đó, bao gồm các bài kiểm tra và hình ảnh.

Sân khấu trực tuyến

Ở giai đoạn trực tuyến, nhiệm vụ được chia thành 3 phần

Sân khấu ngoại tuyến

Ở giai đoạn ngoại tuyến, dữ liệu bao gồm tất cả các tính năng, trong khi văn bản và hình ảnh còn thưa thớt. Có nhiều hàng hơn 1,5 lần trong tập dữ liệu, trong đó đã có rất nhiều hàng.

Giải pháp của vấn đề

Vì làm CV tại nơi làm việc nên tôi bắt đầu hành trình tham gia cuộc thi này với nhiệm vụ “Hình ảnh”. Dữ liệu được cung cấp là userId, objectId, ownerId (nhóm trong đó bài đăng được xuất bản), dấu thời gian để tạo và hiển thị bài đăng và tất nhiên là hình ảnh cho bài đăng này.
Sau khi tạo ra một số tính năng dựa trên dấu thời gian, ý tưởng tiếp theo là lấy lớp áp chót của nơ-ron được huấn luyện trước trên imagenet và gửi các phần nhúng này để tăng cường.

SNA Hackathon 2019

Kết quả không ấn tượng. Tôi nghĩ rằng việc nhúng từ nơ-ron hình ảnh là không liên quan, tôi cần phải tạo bộ mã hóa tự động của riêng mình.

SNA Hackathon 2019

Phải mất rất nhiều thời gian và kết quả không được cải thiện.

Tạo tính năng

Làm việc với hình ảnh tốn rất nhiều thời gian nên tôi quyết định làm điều gì đó đơn giản hơn.
Như bạn có thể thấy ngay, có một số tính năng được phân loại trong tập dữ liệu và để không phải bận tâm quá nhiều, tôi chỉ dùng catboost. Giải pháp này thật tuyệt vời, không cần bất kỳ cài đặt nào, tôi ngay lập tức đứng ở dòng đầu tiên của bảng xếp hạng.

Có khá nhiều dữ liệu và nó được trình bày ở định dạng sàn gỗ, vì vậy không cần suy nghĩ kỹ, tôi lấy scala và bắt đầu viết mọi thứ bằng spark.

Các tính năng đơn giản nhất mang lại mức tăng trưởng cao hơn tính năng nhúng hình ảnh:

  • số lần objectId, userId và ownerId xuất hiện trong dữ liệu (sẽ tương quan với mức độ phổ biến);
  • số lượng bài đăng mà userId đã xem từ ownerId (phải tương quan với mức độ quan tâm của người dùng đối với nhóm);
  • có bao nhiêu userId duy nhất đã xem các bài đăng từ ownerId (phản ánh quy mô đối tượng của nhóm).

Từ dấu thời gian, có thể biết được thời gian trong ngày mà người dùng đã xem nguồn cấp dữ liệu (sáng/chiều/tối/đêm). Bằng cách kết hợp các danh mục này, bạn có thể tiếp tục tạo ra các tính năng:

  • số lần userId đăng nhập vào buổi tối;
  • bài đăng này thường được hiển thị vào thời điểm nào (objectId), v.v.

Tất cả điều này dần dần cải thiện các số liệu. Nhưng kích thước của tập dữ liệu huấn luyện là khoảng 20 triệu bản ghi, do đó, việc thêm các tính năng sẽ làm chậm quá trình đào tạo rất nhiều.

Tôi đã suy nghĩ lại cách tiếp cận của mình trong việc sử dụng dữ liệu. Mặc dù dữ liệu phụ thuộc vào thời gian, nhưng tôi không thấy bất kỳ rò rỉ thông tin rõ ràng nào “trong tương lai”, tuy nhiên, để đề phòng, tôi chia nhỏ nó như thế này:

SNA Hackathon 2019

Bộ đào tạo cung cấp cho chúng tôi (tháng 2 và 2 tuần của tháng XNUMX) được chia thành XNUMX phần.
Mô hình đã được đào tạo về dữ liệu từ N ngày qua. Các tổng hợp được mô tả ở trên được xây dựng trên tất cả dữ liệu, bao gồm cả bài kiểm tra. Đồng thời, dữ liệu đã xuất hiện để có thể xây dựng các bảng mã khác nhau của biến mục tiêu. Cách tiếp cận đơn giản nhất là sử dụng lại mã đã tạo các tính năng mới và chỉ cần cung cấp cho nó dữ liệu mà nó sẽ không được đào tạo và target = 1.

Vì vậy, chúng tôi có các tính năng tương tự:

  • userId đã xem một bài đăng trong ownerId của nhóm bao nhiêu lần;
  • Số lần userId thích bài đăng trong nhóm ownerId;
  • Phần trăm bài đăng mà userId thích từ ownerId.

Tức là hóa ra mã hóa mục tiêu trung bình trên một phần của tập dữ liệu cho các kết hợp khác nhau của các tính năng phân loại. Về nguyên tắc, catboost cũng xây dựng mã hóa mục tiêu và theo quan điểm này thì không có lợi ích gì, tuy nhiên, chẳng hạn, có thể đếm số lượng người dùng duy nhất thích các bài đăng trong nhóm này. Đồng thời, mục tiêu chính đã đạt được - tập dữ liệu của tôi đã bị giảm đi nhiều lần và có thể tiếp tục tạo ra các tính năng.

Mặc dù catboost chỉ có thể xây dựng mã hóa dựa trên phản ứng thích, nhưng phản hồi có các phản ứng khác: chia sẻ lại, không thích, không thích, nhấp vào, bỏ qua, mã hóa có thể được thực hiện thủ công. Tôi đã tính toán lại tất cả các loại tổng hợp và loại bỏ các tính năng có tầm quan trọng thấp để không làm tăng tập dữ liệu.

Vào thời điểm đó tôi đã đứng ở vị trí đầu tiên với khoảng cách khá xa. Điều khó hiểu duy nhất là việc nhúng hình ảnh hầu như không tăng trưởng. Ý tưởng là trao mọi thứ cho catboost. Chúng tôi phân cụm các hình ảnh Kmeans và nhận được một tính năng phân loại mới imageCat.

Dưới đây là một số lớp sau khi lọc thủ công và hợp nhất các cụm thu được từ KMeans.

SNA Hackathon 2019

Dựa trên imageCat chúng tôi tạo ra:

  • Các tính năng phân loại mới:
    • ImageCat nào được userId xem thường xuyên nhất;
    • ImageCat nào thường hiển thị ownerId nhất;
    • ImageCat nào được userId thích thường xuyên nhất;
  • Các quầy khác nhau:
    • Có bao nhiêu imageCat duy nhất đã xem userId;
    • Khoảng 15 tính năng tương tự cộng với mã hóa mục tiêu như mô tả ở trên.

Nội dung

Kết quả trong cuộc thi hình ảnh phù hợp với tôi và tôi quyết định thử sức với lĩnh vực văn bản. Tôi chưa từng làm việc nhiều với văn bản trước đây và thật ngu ngốc, tôi đã giết chết cả ngày với tf-idf và svd. Sau đó, tôi thấy đường cơ sở với doc2vec, nó thực hiện chính xác những gì tôi cần. Sau khi điều chỉnh một chút các tham số doc2vec, tôi đã có được phần nhúng văn bản.

Và sau đó tôi chỉ cần sử dụng lại mã cho hình ảnh, trong đó tôi đã thay thế phần nhúng hình ảnh bằng phần nhúng văn bản. Kết quả em đã đứng thứ 2 trong phần thi văn bản.

Hệ thống hợp tác

Còn một cuộc thi mà tôi vẫn chưa “chọc” bằng gậy, và theo đánh giá của AUC trên bảng xếp hạng, kết quả của cuộc thi cụ thể này đáng lẽ phải có tác động lớn nhất đến giai đoạn ngoại tuyến.
Tôi đã lấy tất cả các tính năng có trong dữ liệu nguồn, chọn lọc các tính năng được phân loại và tính toán tổng hợp giống như đối với hình ảnh, ngoại trừ các tính năng dựa trên chính hình ảnh đó. Chỉ cần đưa cái này vào catboost đã đưa tôi lên vị trí thứ 2.

Các bước đầu tiên của tối ưu hóa catboost

Vị trí thứ nhất và thứ hai làm tôi hài lòng, nhưng tôi hiểu rằng tôi chưa làm được điều gì đặc biệt, điều đó có nghĩa là tôi có thể bị mất vị trí.

Nhiệm vụ của cuộc thi là xếp hạng các bài đăng trong người dùng và suốt thời gian qua tôi đã giải quyết vấn đề phân loại, tức là tối ưu hóa số liệu sai.

Tôi sẽ đưa ra một ví dụ đơn giản:

tên người dùng ID đối tượng dự đoán thực địa
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 1
1 14 0.5 0
2 15 0.4 0
2 16 0.3 1

Hãy thực hiện một sự sắp xếp lại nhỏ

tên người dùng ID đối tượng dự đoán thực địa
1 10 0.9 1
1 11 0.8 1
1 12 0.7 1
1 13 0.6 0
2 16 0.5 1
2 15 0.4 0
1 14 0.3 1

Chúng tôi nhận được kết quả sau:

kiểu mẫu AUC Người dùng1 AUC Người dùng2 AUC có nghĩa là AUC
Tùy chọn 1 0,8 1,0 0,0 0,5
Tùy chọn 2 0,7 0,75 1,0 0,875

Như bạn có thể thấy, việc cải thiện chỉ số AUC tổng thể không có nghĩa là cải thiện chỉ số AUC trung bình của một người dùng.

CatBoost biết cách tối ưu hóa số liệu xếp hạng từ chiếc hộp. Tôi đọc về các số liệu xếp hạng, câu chuyện thành công khi sử dụng catboost và đặt YetiRankPairwise để luyện tập qua đêm. Kết quả không ấn tượng. Quyết định rằng mình chưa được đào tạo bài bản, tôi đã thay đổi hàm lỗi thành QueryRMSE, theo đánh giá của tài liệu catboost, hàm này sẽ hội tụ nhanh hơn. Cuối cùng, tôi đạt được kết quả tương tự như khi luyện tập phân loại, nhưng khả năng phối hợp của hai mô hình này đã tăng lên đáng kể, giúp tôi giành vị trí thứ nhất trong cả ba cuộc thi.

5 phút trước khi kết thúc giai đoạn trực tuyến của cuộc thi “Hệ thống hợp tác”, Sergey Shalnov đã đưa tôi lên vị trí thứ hai. Chúng tôi cùng nhau bước đi trên con đường xa hơn.

Chuẩn bị cho giai đoạn offline

Chúng tôi đã được đảm bảo chiến thắng trong vòng thi trực tuyến với card màn hình RTX 2080 TI, nhưng giải thưởng chính 300 rúp và rất có thể, ngay cả vị trí đầu tiên cuối cùng cũng buộc chúng tôi phải làm việc trong 000 tuần này.

Hóa ra, Sergey cũng đã sử dụng catboost. Chúng tôi đã trao đổi ý tưởng và tính năng và tôi đã tìm hiểu về báo cáo của Anna Veronica Dorogush trong đó có câu trả lời cho nhiều câu hỏi của tôi và thậm chí cả những câu hỏi mà tôi chưa có vào thời điểm đó.

Việc xem báo cáo khiến tôi nảy ra ý tưởng rằng chúng ta cần trả tất cả các tham số về giá trị mặc định và thực hiện các cài đặt rất cẩn thận và chỉ sau khi sửa một bộ tính năng. Bây giờ, một khóa đào tạo mất khoảng 15 giờ, nhưng một mô hình đã đạt được tốc độ tốt hơn so với tốc độ đạt được trong nhóm có xếp hạng.

Tạo tính năng

Trong cuộc thi Hệ thống hợp tác, một số lượng lớn các tính năng được đánh giá là quan trọng đối với mô hình. Ví dụ, kiểm toán_spark_svd - dấu hiệu quan trọng nhất, nhưng không có thông tin về ý nghĩa của nó. Tôi nghĩ sẽ đáng giá nếu đếm các tổng hợp khác nhau dựa trên các đặc điểm quan trọng. Ví dụ: Auditweights_spark_svd trung bình theo người dùng, theo nhóm, theo đối tượng. Điều tương tự có thể được tính toán bằng cách sử dụng dữ liệu không được đào tạo và mục tiêu = 1, nghĩa là trung bình kiểm toán_spark_svd bởi người dùng bởi các đối tượng anh ta thích. Ngoài ra còn có những dấu hiệu quan trọng kiểm toán_spark_svd, Có một vài. Dưới đây là một số trong số họ:

  • kiểm toánCtrGiới tính
  • trọng số kiểm traCtrCao
  • userOwnerCounterTạo lượt thích

Ví dụ, trung bình kiểm toánCtrGiới tính theo userId, hóa ra đó là một tính năng quan trọng, giống như giá trị trung bình userOwnerCounterTạo lượt thích bởi userId+ownerId. Điều này chắc hẳn sẽ khiến bạn nghĩ rằng bạn cần hiểu ý nghĩa của các trường.

Ngoài ra các tính năng quan trọng là kiểm toánSố lượt thíchSố lượng и kiểm toánTriển lãmĐếm. Chia từng cái một, người ta đã thu được một tính năng thậm chí còn quan trọng hơn.

Rò rỉ dữ liệu

Cạnh tranh và mô hình sản xuất là những nhiệm vụ rất khác nhau. Khi chuẩn bị dữ liệu, rất khó để tính đến tất cả các chi tiết và không truyền tải một số thông tin không tầm thường về biến mục tiêu trong thử nghiệm. Nếu chúng tôi đang tạo một giải pháp sản xuất, chúng tôi sẽ cố gắng tránh sử dụng rò rỉ dữ liệu khi đào tạo mô hình. Nhưng nếu chúng ta muốn giành chiến thắng trong cuộc cạnh tranh thì rò rỉ dữ liệu là tính năng tốt nhất.

Sau khi nghiên cứu dữ liệu, bạn có thể thấy điều đó theo các giá trị objectId kiểm toánSố lượt thíchSố lượng и kiểm toánTriển lãmĐếm thay đổi, có nghĩa là tỷ lệ giá trị tối đa của các tính năng này sẽ phản ánh chuyển đổi bài đăng tốt hơn nhiều so với tỷ lệ tại thời điểm hiển thị.

Rò rỉ đầu tiên chúng tôi tìm thấy là AuditweightsLikeCountMax/auditweightsShowsCountMax.
Nhưng nếu chúng ta xem xét dữ liệu kỹ hơn thì sao? Hãy sắp xếp theo ngày chiếu và nhận:

ID đối tượng tên người dùng kiểm toánTriển lãmĐếm kiểm toánSố lượt thíchSố lượng mục tiêu (được thích)
1 1 12 3 chắc là không
1 2 15 3 có thể đúng
1 3 16 4

Thật ngạc nhiên khi tôi tìm thấy ví dụ đầu tiên như vậy và hóa ra dự đoán của tôi đã không thành hiện thực. Tuy nhiên, tính đến thực tế là giá trị tối đa của các đặc điểm này trong đối tượng đã tăng lên, chúng tôi không lười biếng và quyết định tìm AuditweightsShowsCountTiếp theo и kiểm toánSố lượt thíchĐếmTiếp theo, tức là các giá trị tại thời điểm tiếp theo. Bằng cách thêm một tính năng
(auditweightsShowsCountNext-auditweightsShowsCount)/(auditweightsLikesCount-auditweightsLikesCountNext) chúng tôi đã thực hiện một bước nhảy vọt một cách nhanh chóng.
Những rò rỉ tương tự có thể được sử dụng bằng cách tìm các giá trị sau cho userOwnerCounterTạo lượt thích trong userId+ownerId và, ví dụ: kiểm toánCtrGiới tính trong objectId+userGender. Chúng tôi đã tìm thấy 6 trường tương tự bị rò rỉ và trích xuất càng nhiều thông tin càng tốt từ chúng.

Vào thời điểm đó, chúng tôi đã thu thập được càng nhiều thông tin càng tốt từ các tính năng cộng tác, nhưng không quay trở lại cuộc thi hình ảnh và văn bản. Tôi có một ý tưởng tuyệt vời để kiểm tra: các tính năng trực tiếp dựa trên hình ảnh hoặc văn bản mang lại bao nhiêu trong các cuộc thi có liên quan?

Không có rò rỉ nào trong các cuộc thi hình ảnh và văn bản, nhưng vào thời điểm đó tôi đã trả về các tham số catboost mặc định, dọn sạch mã và thêm một số tính năng. Tổng cộng là:

phán quyết sớm
Tối đa với hình ảnh 0.6411
Tối đa không có hình ảnh 0.6297
Kết quả giải nhì 0.6295

phán quyết sớm
Tối đa với văn bản 0.666
Tối đa không có văn bản 0.660
Kết quả giải nhì 0.656

phán quyết sớm
Tối đa trong hợp tác 0.745
Kết quả giải nhì 0.723

Rõ ràng là chúng tôi khó có thể khai thác được nhiều văn bản và hình ảnh, và sau khi thử một vài ý tưởng thú vị nhất, chúng tôi đã ngừng làm việc với chúng.

Việc tạo thêm các tính năng trong hệ thống cộng tác không tăng lên và chúng tôi bắt đầu xếp hạng. Ở giai đoạn trực tuyến, tổng thể phân loại và xếp hạng đã mang lại cho tôi một sự gia tăng nhỏ, hóa ra là do tôi đã đào tạo chưa kỹ về phân loại. Không có hàm lỗi nào, kể cả YetiRanlPairwise, tạo ra bất kỳ kết quả nào gần với kết quả mà LogLoss đã làm (0,745 so với 0,725). Vẫn còn hy vọng cho QueryCrossEntropy nhưng không thể tung ra được.

Sân khấu ngoại tuyến

Ở giai đoạn ngoại tuyến, cấu trúc dữ liệu vẫn giữ nguyên nhưng có những thay đổi nhỏ:

  • các mã định danh userId, objectId, ownerId đã được sắp xếp lại;
  • một số biển hiệu đã bị dỡ bỏ và một số biển hiệu đã được đổi tên;
  • dữ liệu đã tăng khoảng 1,5 lần.

Ngoài những khó khăn được liệt kê, còn có một điểm cộng lớn: nhóm đã được cấp một máy chủ lớn với RTX 2080TI. Tôi đã thích htop từ lâu.
SNA Hackathon 2019

Chỉ có một ý tưởng - đơn giản là tái tạo những gì đã tồn tại. Sau khi dành vài giờ để thiết lập môi trường trên máy chủ, chúng tôi dần dần bắt đầu xác minh rằng kết quả có thể lặp lại được. Vấn đề chính mà chúng ta đang gặp phải là sự gia tăng khối lượng dữ liệu. Chúng tôi quyết định giảm tải một chút và đặt tham số catboost ctr_complexity=1. Điều này làm giảm tốc độ một chút, nhưng mô hình của tôi đã bắt đầu hoạt động, kết quả rất tốt - 0,733. Sergey, không giống như tôi, không chia dữ liệu thành 2 phần và đào tạo trên tất cả dữ liệu, mặc dù điều này mang lại kết quả tốt nhất ở giai đoạn trực tuyến, nhưng ở giai đoạn ngoại tuyến lại gặp rất nhiều khó khăn. Nếu chúng tôi lấy tất cả các tính năng mà chúng tôi đã tạo và cố gắng đưa chúng vào catboost thì sẽ không có gì hoạt động ở giai đoạn trực tuyến. Sergey đã thực hiện tối ưu hóa kiểu, ví dụ: chuyển đổi kiểu float64 thành float32. Trong bài viết này, Bạn có thể tìm thấy thông tin về tối ưu hóa bộ nhớ trong pandas. Kết quả là Sergey đã huấn luyện CPU bằng cách sử dụng tất cả dữ liệu và nhận được khoảng 0,735.

Kết quả này đủ để giành chiến thắng, nhưng chúng tôi đã che giấu tốc độ thực sự của mình và không thể chắc chắn rằng các đội khác có làm được điều tương tự hay không.

Chiến đấu đến cuối cùng

Điều chỉnh Catboost

Giải pháp của chúng tôi đã được sao chép hoàn toàn, chúng tôi đã thêm các tính năng của dữ liệu văn bản và hình ảnh, vì vậy tất cả những gì còn lại là điều chỉnh các thông số catboost. Sergey đã đào tạo về CPU với một số lần lặp nhỏ và tôi đã đào tạo về CPU với ctr_complexity=1. Chỉ còn một ngày và nếu bạn chỉ cần thêm số lần lặp lại hoặc tăng độ phức tạp của ctr, thì đến sáng bạn có thể đạt được tốc độ tốt hơn nữa và đi bộ cả ngày.

Ở giai đoạn ngoại tuyến, tốc độ có thể bị ẩn rất dễ dàng bằng cách chọn không phải giải pháp tốt nhất trên trang web. Chúng tôi đã mong đợi những thay đổi mạnh mẽ trên bảng xếp hạng trong những phút cuối trước khi quá trình gửi bài kết thúc và quyết định không dừng lại.

Từ video của Anna, tôi biết được rằng để nâng cao chất lượng của mô hình, tốt nhất nên chọn các thông số sau:

  • tỷ lệ học — Giá trị mặc định được tính dựa trên kích thước của tập dữ liệu. Việc tăng learning_rate đòi hỏi phải tăng số lần lặp.
  • l2_leaf_reg — Hệ số chính quy hóa, giá trị mặc định là 3, tốt nhất nên chọn từ 2 đến 30. Việc giảm giá trị sẽ dẫn đến tăng mức độ phù hợp quá mức.
  • đóng bao_nhiệt độ - bổ sung tính ngẫu nhiên cho trọng số của các đối tượng trong mẫu. Giá trị mặc định là 1, trong đó các trọng số được rút ra từ phân bố mũ. Giảm giá trị dẫn đến tăng mức độ trang bị quá mức.
  • sức mạnh ngẫu nhiên — Ảnh hưởng đến việc lựa chọn các phần tách ở một lần lặp cụ thể. Random_ Strength càng cao thì khả năng chọn được phần phân chia có tầm quan trọng thấp càng cao. Ở mỗi lần lặp tiếp theo, tính ngẫu nhiên giảm dần. Giảm giá trị dẫn đến tăng mức độ trang bị quá mức.

Các tham số khác có ảnh hưởng nhỏ hơn nhiều đến kết quả cuối cùng, vì vậy tôi không cố chọn chúng. Một lần đào tạo lặp lại trên tập dữ liệu GPU của tôi với ctr_complexity=1 mất 20 phút và các tham số được chọn trên tập dữ liệu đã giảm hơi khác so với các tham số tối ưu trên tập dữ liệu đầy đủ. Cuối cùng, tôi đã thực hiện khoảng 30 lần lặp trên 10% dữ liệu và sau đó thêm khoảng 10 lần lặp nữa trên tất cả dữ liệu. Hóa ra một cái gì đó như thế này:

  • tỷ lệ học Tôi đã tăng 40% so với mặc định;
  • l2_leaf_reg để nó như cũ;
  • đóng bao_nhiệt độ и sức mạnh ngẫu nhiên giảm xuống còn 0,8.

Chúng ta có thể kết luận rằng mô hình đã được đào tạo chưa đầy đủ với các tham số mặc định.

Tôi rất bất ngờ khi nhìn thấy kết quả trên bảng xếp hạng:

kiểu mẫu mô hình 1 mô hình 2 mô hình 3 hòa tấu
Không điều chỉnh 0.7403 0.7404 0.7404 0.7407
Với điều chỉnh 0.7406 0.7405 0.7406 0.7408

Tôi đã tự mình kết luận rằng nếu không cần áp dụng nhanh mô hình thì tốt hơn nên thay thế việc lựa chọn các tham số bằng một tập hợp nhiều mô hình sử dụng các tham số không được tối ưu hóa.

Sergey đang tối ưu hóa kích thước của tập dữ liệu để chạy nó trên GPU. Tùy chọn đơn giản nhất là cắt bỏ một phần dữ liệu, nhưng điều này có thể được thực hiện theo một số cách:

  • loại bỏ dần dữ liệu cũ nhất (đầu tháng XNUMX) cho đến khi tập dữ liệu bắt đầu vừa với bộ nhớ;
  • loại bỏ các tính năng có tầm quan trọng thấp nhất;
  • xóa userIds chỉ có một mục nhập;
  • chỉ để lại các userId đang trong thử nghiệm.

Và cuối cùng, tạo ra một tập hợp từ tất cả các lựa chọn.

Bản hòa tấu cuối cùng

Đến tối muộn ngày cuối cùng, chúng tôi đã đưa ra một tập hợp các mô hình của mình và mang lại kết quả là 0,742. Qua đêm, tôi đã khởi chạy mô hình của mình với ctr_complexity=2 và thay vì 30 phút, nó đã huấn luyện trong 5 giờ. Chỉ đến 4 giờ sáng, nó mới được tính, và tôi đã thực hiện bản hòa tấu cuối cùng, đạt 0,7433 trên bảng xếp hạng công khai.

Do các cách tiếp cận khác nhau để giải quyết vấn đề, các dự đoán của chúng tôi không có mối tương quan chặt chẽ với nhau, điều này đã tạo ra sự gia tăng đáng kể về tổng thể. Để có được một bản tổng hợp tốt, tốt hơn hết bạn nên sử dụng các dự đoán mô hình thô dự đoán(prediction_type='RawFormulaVal') và đặtscale_pos_weight=neg_count/pos_count.

SNA Hackathon 2019

Trên trang web bạn có thể thấy kết quả cuối cùng trên bảng xếp hạng riêng.

Các giải pháp khác

Nhiều đội đã tuân theo các tiêu chuẩn của thuật toán hệ thống gợi ý. Tôi, không phải là chuyên gia trong lĩnh vực này, không thể đánh giá chúng, nhưng tôi nhớ 2 giải pháp thú vị.

  • Giải pháp của Nikolay Anokhin. Nikolay, là nhân viên của Mail.ru, không đăng ký nhận giải thưởng, vì vậy mục tiêu của anh không phải là đạt được tốc độ tối đa mà là có được một giải pháp dễ dàng mở rộng.
  • Quyết định của ban giám khảo đoạt giải dựa trên bài viết này từ facebook, cho phép phân cụm hình ảnh rất tốt mà không cần thực hiện thủ công.

Kết luận

Điều đọng lại trong trí nhớ tôi nhiều nhất:

  • Nếu có các đặc điểm phân loại trong dữ liệu và bạn biết cách mã hóa mục tiêu một cách chính xác thì tốt hơn hết bạn nên thử catboost.
  • Nếu bạn đang tham gia một cuộc thi, bạn không nên lãng phí thời gian để chọn các tham số khác ngoài learning_rate và iterations. Một giải pháp nhanh hơn là tạo ra một tập hợp nhiều mô hình.
  • Tăng cường có thể học trên GPU. Catboost có thể học rất nhanh trên GPU nhưng lại ngốn rất nhiều bộ nhớ.
  • Trong quá trình phát triển và thử nghiệm ý tưởng, tốt hơn nên đặt rsm~=0.2 nhỏ (chỉ CPU) và ctr_complexity=1.
  • Không giống như các đội khác, nhóm người mẫu của chúng tôi đã tăng lên đáng kể. Chúng tôi chỉ trao đổi ý tưởng và viết bằng các ngôn ngữ khác nhau. Chúng tôi có một cách tiếp cận khác để phân chia dữ liệu và tôi nghĩ mỗi cách đều có những lỗi riêng.
  • Không rõ tại sao tối ưu hóa xếp hạng lại hoạt động kém hơn tối ưu hóa phân loại.
  • Tôi đã có được một số kinh nghiệm làm việc với văn bản và hiểu biết về cách tạo ra hệ thống gợi ý.

SNA Hackathon 2019

Cảm ơn ban tổ chức vì những cảm xúc, kiến ​​thức và giải thưởng đã nhận được.

Nguồn: www.habr.com

Thêm một lời nhận xét