기계 학습을 사용하여 Query Service에서 보트 필터링

봇 활동은 분석 지표에 영향을 미치고 데이터 무결성을 손상시킬 수 있습니다. Adobe Experience Platform Query Service은(는) 보트 필터링 프로세스를 통해 데이터 품질을 유지하는 데 사용할 수 있습니다.

보트 필터링을 사용하면 웹 사이트와 비인간적인 상호 작용으로 인해 발생하는 데이터 오염을 광범위하게 제거하여 데이터 품질을 유지할 수 있습니다. 이 프로세스는 SQL 쿼리와 머신 러닝을 결합하여 수행됩니다.

봇 활동은 여러 가지 방법으로 식별할 수 있습니다. 이 문서에서 설명하는 접근 방식은 활동 스파이크, 이 경우 지정된 기간 동안 사용자가 수행한 작업의 수에 중점을 둡니다. 처음에 SQL 쿼리는 보트 활동으로 분류하기 위해 일정 기간 동안 수행한 작업 수에 대한 임계값을 임의로 설정합니다. 그런 다음 이 임계값은 이러한 비율의 정확도를 개선하기 위해 기계 학습 모델을 사용하여 동적으로 정제된다.

이 문서에서는 환경에서 프로세스를 설정하는 데 필요한 SQL 보트 필터링 쿼리와 머신 러닝 모델에 대한 개요와 자세한 예제를 제공합니다.

시작하기

이 프로세스의 일부로 머신 러닝 모델을 교육해야 하므로 이 문서에서는 하나 이상의 머신 러닝 환경에 대한 작업 지식을 가정합니다.

이 예제에서는 Jupyter Notebook을(를) 개발 환경으로 사용합니다. 사용할 수 있는 옵션은 많지만 계산 요구 사항이 낮은 오픈 소스 웹 응용 프로그램이므로 Jupyter Notebook을(를) 사용하는 것이 좋습니다. 공식 사이트에서 다운로드할 수 있습니다.

보트 활동에 대한 임계값을 정의하려면 Query Service을(를) 사용하십시오.

봇 탐지를 위한 데이터를 추출하는 데 사용되는 두 가지 속성은 다음과 같습니다.

  • Experience Cloud 방문자 ID(ECID, MCID라고도 함): 모든 Adobe 솔루션에서 방문자를 식별하는 범용 영구 ID를 제공합니다.
  • 타임스탬프: 웹 사이트에서 활동이 발생한 경우 시간 및 날짜를 UTC 형식으로 제공합니다.
NOTE
아래 예제에서 볼 수 있듯이 Experience Cloud 방문자 ID에 대한 네임스페이스 참조에서 mcid을(를) 사용하고 있습니다.

다음 SQL 문은 보트 활동을 식별하는 초기 예를 제공합니다. 문은 방문자가 1분 내에 50번의 클릭을 수행하면 사용자가 봇이라고 가정합니다.

SELECT *
FROM   <YOUR_TABLE_NAME>
WHERE  enduserids._experience.mcid NOT IN (SELECT enduserids._experience.mcid
                                           FROM   <YOUR_TABLE_NAME>
                                           GROUP  BY Unix_timestamp(timestamp) /
                                                     60,
                                                     enduserids._experience.mcid
                                           HAVING Count(*) > 50);

이 식은 임계값을 충족하지만 다른 간격의 트래픽 스파이크를 해결하지는 않는 모든 방문자의 ECID(mcid)를 필터링합니다.

머신 러닝을 통해 보트 탐지 기능 향상

초기 SQL 문을 세분화하여 머신 러닝을 위한 기능 추출 쿼리가 될 수 있습니다. 향상된 쿼리는 정확도가 높은 머신 러닝 모델을 트레이닝하기 위한 다양한 간격에 대해 더 많은 기능을 생성해야 한다.

예제 문은 클릭 수가 각각 300과 1800인 5분 및 30분 기간을 포함하도록 최대 60번의 클릭으로 1분에서 확장됩니다.

예제 문은 여러 기간 동안 각 ECID(mcid)의 최대 클릭 수를 수집합니다. 초기 명령문은 1분(60초), 5분(300초) 및 1시간(즉, 1800초) 기간을 포함하도록 확장되었습니다.

SELECT table_count_1_min.mcid AS id,
       count_1_min,
       count_5_mins,
       count_30_mins
FROM   ( ( (SELECT mcid,
                 Max(count_1_min) AS count_1_min
          FROM   (SELECT enduserids._experience.mcid.id AS mcid,
                         Count(*)                       AS count_1_min
                  FROM
       <YOUR_TABLE_NAME>
                  GROUP  BY Unix_timestamp(timestamp) / 60,
                            enduserids._experience.mcid.id)
          GROUP BY mcid) AS table_count_1_min
           LEFT JOIN (SELECT mcid,
                             Max(count_5_mins) AS count_5_mins
                      FROM   (SELECT enduserids._experience.mcid.id AS mcid,
                                     Count(*)                       AS
                                     count_5_mins
                              FROM
           <YOUR_TABLE_NAME>
                              GROUP  BY Unix_timestamp(timestamp) / 300,
                                        enduserids._experience.mcid.id)
                      GROUP  BY mcid) AS table_count_5_mins
                  ON table_count_1_min.mcid = table_count_5_mins.mcid )
         LEFT JOIN (SELECT mcid,
                           Max(count_30_mins) AS count_30_mins
                    FROM   (SELECT enduserids._experience.mcid.id AS mcid,
                                   Count(*)                       AS
                                   count_30_mins
                            FROM
         <YOUR_TABLE_NAME>
                            GROUP  BY Unix_timestamp(timestamp) / 1800,
                                      enduserids._experience.mcid.id)
                    GROUP  BY mcid) AS table_count_30_mins
                ON table_count_1_min.mcid = table_count_30_mins.mcid )

이 표현식의 결과는 아래에 제공된 표와 유사할 수 있습니다.

id
count_1_min
count_5_min
count_30_min
4833075303848917832
1
1
1
1469109497068938520
1
1
1
5045682519445554093
1
1
1
7148203816406620066
3
3
3
1013065429311352386
1
1
1
3077475871984695013
7
7
7
4151486040344674930
2
2
2
6563366098591762751
6
6
6
2403566105776993627
4
4
4
5710530640819698543
1
1
1
3675089655839425960
1
1
1
9091930660723241307
1
1
1

머신 러닝을 사용하여 새로운 스파이크 임계값 식별

그런 다음 결과 쿼리 데이터 세트를 CSV 형식으로 내보낸 다음 Jupyter Notebook (으)로 가져옵니다. 해당 환경에서 현재 머신 러닝 라이브러리를 사용하여 머신 러닝 모델을 교육할 수 있습니다. 데이터를 Query Service CSV 형식으로 내보내는 방법에 대한 자세한 내용은 문제 해결 안내서를 참조하십시오

처음에 설정된 애드혹 스파이크 임계값은 데이터 기반이 아니므로 정확도가 떨어집니다. 머신 러닝 모델을 사용하여 매개변수를 임계값으로 교육할 수 있습니다. 따라서 불필요한 기능을 제거하여 GROUP BY 키워드 수를 줄여 쿼리 효율성을 높일 수 있습니다.

이 예제에서는 Jupyter Notebook과(와) 함께 기본적으로 설치된 Scikit-Learn 머신 러닝 라이브러리를 사용합니다. "pandas" python 라이브러리도 여기서 사용하기 위해 수입됩니다. 다음 명령이 Jupyter Notebook에 입력되었습니다.

import pandas as ps

df = pd_read.csv('data/bot.csv')
df = df[df['count_1-min'] > 1]
df['is_bot'] = 0
df.loc[df['count_1_min'] > 50,'is_bot'] = 1
df

다음으로, 데이터 세트에 의사 결정 트리 분류자를 교육하고 모델에서 기인하는 논리를 관찰해야 합니다.

아래 예에서 의사 결정 트리 분류자를 시각화하는 데 "Matplotlib" 라이브러리를 사용합니다.

from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
from matplotlib import pyplot as plt

X = df.iloc[:,:[1,3]]
y = df.iloc[:,-1]

clf = DecisionTreeClassifier(max_leaf_nodes=2, random_state=0)
clf.fit(X,y)

print("Model Accuracy: {:.5f}".format(clf.scre(X,y)))

tree.plot_tree(clf,feature_names=X.columns)
plt.show()

이 예제의 Jupyter Notebook에서 반환된 값은 다음과 같습니다.

Model Accuracy: 0.99935

기계 학습 모델 Jupyter Notebook의 통계 출력.

위의 예에 나타난 모형에 대한 결과는 99% 이상 정확하다.

의사 결정 트리 분류자는 예약된 쿼리를 사용하여 정기적으로 Query Service의 데이터를 사용하여 학습할 수 있으므로 높은 정확도로 보트 활동을 필터링하여 데이터 무결성을 보장할 수 있습니다. 머신 러닝 모델에서 파생된 매개 변수를 사용하면 모델에서 만든 매우 정확한 매개 변수로 원래 쿼리를 업데이트할 수 있습니다.

예제 모델은 5분 동안 130개가 넘는 상호 작용을 하는 모든 방문자가 봇이라는 높은 정확도로 결정되었습니다. 이제 이 정보를 사용하여 보트 필터링 SQL 쿼리를 구체화할 수 있습니다.

다음 단계

이 문서를 읽으면 Query Service 및 머신 러닝을 사용하여 보트 활동을 결정하고 필터링하는 방법을 더 잘 이해할 수 있습니다.

조직의 전략적 비즈니스 인사이트에 대한 Query Service의 이점을 보여 주는 다른 문서는 중단된 찾아보기 사용 사례 예입니다.

recommendation-more-help
ccf2b369-4031-483f-af63-a93b5ae5e3fb