원하는 Facebook 사이트를 기반으로 사용자의 나이를 추정하기위한 기계 학습 기술


25

Facebook 응용 프로그램의 데이터베이스가 있으며 머신 러닝을 사용하여 Facebook 사이트의 선호도에 따라 사용자의 나이를 추정하려고합니다.

내 데이터베이스에는 세 가지 중요한 특성이 있습니다.

  • 내 훈련 세트의 연령 분포 (총 사용자 수 12k)는 더 젊은 사용자 (예 : 27 세의 1157 명의 사용자와 65 세의 23 명의 사용자)로 비뚤어져 있습니다.

  • 많은 사이트는 5 개 이하의 좋아요를 가지고 있습니다 (FB 사이트를 5 개 이하로 필터링했습니다).

  • 샘플보다 더 많은 기능이 있습니다.

내 질문은 다음과 같습니다. 추가 분석을 위해 데이터를 준비하기 위해 어떤 전략을 제안 하시겠습니까? 일종의 차원 축소를 수행해야합니까? 이 경우 어떤 ML 방법이 가장 적합합니까?

나는 주로 Python을 사용하므로 Python 관련 힌트를 높이 평가할 것입니다.


1
"샘플보다 많은 기능"이라고 말하면 좋아하는 사이트의 고유 한 수가 >> num user임을 의미합니다. 사이트의 루트 도메인도 마찬가지입니까? 즉, 사이트에 다수의 youtube.com 또는 cnn.com URL이 있습니까? 아니면 이미 도메인으로 연결 되었습니까? 가능한 경우 특정 페이지가 아닌 도메인 루트로 URL을 축소하여 차원 축소에 집중하고 있습니다.
cwharland

대답 해줘서 고마워요. 기능 (고유 좋아하는 사이트)의 수는 32k이고 샘플 (사용자)의 수는 12k입니다. 기능은 Facebook 페이지이므로 URL을 막을 필요가 없습니다. 사용자는 facebook.com/cnn을 좋아할 수도 있고 그렇지 않을 수도 있습니다. 그들이 공유하는 링크를 기반으로 사용자의 나이를 추정하는 노력의 생각처럼 I, :)하지만
요이치 Walczak

아, 좋아하는 사이트 설명을 잘못 읽었습니다. 설명해 주셔서 감사합니다.
cwharland

답변:


16

먼저 시작해야 할 것은 k-NN입니다. 여기서 아이디어는 사용자 / 항목 매트릭스가 있고 일부 사용자에게는보고 된 연령이 있다는 것입니다. 사용자 항목 매트릭스에서 개인의 연령은 항목 공간에서 가장 가까운 이웃의 평균 또는 중간 연령과 같은 것으로 결정될 수 있습니다.

따라서 각 사용자가 항목 공간에서 벡터로 표현되고 k 개의 가장 가까운 이웃을 찾고 해당 벡터에 가장 가까운 이웃 연령의 요약 통계를 할당합니다. 열차 탑승 거리에 연령을 반복적으로 할당하고 해당 과제의 오류를 최소화하는 k를 선택하여 거리 컷오프에서 또는보다 현실적으로 k를 선택할 수 있습니다.

차원이 문제인 경우 단일 값 분해를 통해 그룹 전체에서 가장 분산이 큰 m 벡터를 선택하여이 설정을 쉽게 줄일 수 있습니다.

모든 경우에 각 특징이 이진수이기 때문에 코사인 유사성이 거리 측정법으로가는 것 같습니다.

특징 공간의 좁은 초점 (동일한 동작의 모든 변형, 취향)을 고려할 때 다른 접근법 (회귀, rf 등)에 대해 조금 더 생각해야합니다. 사용자 / 항목 접근법이 가장 좋을 것이라고 생각합니다.

주의 할 점은, 기차를 타기위한 연령대가 자체적으로보고 된 경우 일부를 수정해야 할 수도 있습니다. 페이스 북에있는 사람들은 그들이 태어난 10 년 동안 나이를보고하는 경향이 있습니다. 생년월일의 히스토그램 (연대에서 파생)을 플로팅하고 70, 80, 90 년대와 같이 수십 년 동안 급증했는지 확인하십시오.


안녕하세요, 귀하의 답변은 실제 전략과 매우 유사합니다. sklearn.neighbors.KNeighborsRegressorSVD 감소 공간에서 코사인 메트릭과 함께 사용 했습니다 (SVD를 적용한 후 평균 추정 오류가 ~ 6 년에서 ~ 4로 감소했습니다). 내 데이터베이스의 사용자는 18-65 세이며 (이전 사용자는 필터링되었습니다) 48 개의 클래스가 있습니다. kNN에 너무 많은 클래스가 아닌지 여부와 회귀 또는 분류 문제로 취급 해야하는지 궁금합니다 (둘 다 적용 가능하다고 생각합니다).
Wojciech Walczak 12

나는 일화 적으로, 랜덤 클래스마다 클래스를 사용하여 여러 클래스에 개별적으로 적용 한 다음 각 모델의 결과를 다양한 방법으로 결합했다고 말할 수 있습니다. 이 경우 kNN을 사용하여 각 사용자의 연령에 사전 확률을 할당 한 다음 각 클래스 기반 모델을 실행하고 해당 점수를 사용하여 각 클래스의 사전 확률을 업데이트하고 그 후반에서 가장 가능성이 높은 클래스를 선택할 수도 있습니다. 조금 복잡해 보이지만 최악의 경우 kNN 정확도를 갖습니다.
cwharland

7

나는 최근 파이썬에서 비슷한 프로젝트를 수행했으며 (데이터와 같은 FB를 사용하여 의견을 예측) 다음 기본 프로세스로 좋은 결과를 얻었습니다.

  1. 쉼표로 구분 된 레코드처럼 줄 단위로 반복하여 학습 세트 (n = N)를 읽고 카운터를 사용하여 가장 인기있는 페이지를 식별하십시오.
  2. K 개의 가장 인기있는 페이지 (약 5000을 사용했지만 다른 값으로 놀 수 있음)에 대해 pandas.DataFrame.isin을 사용하여 훈련 세트의 각 개인이 각 페이지를 좋아하는지 테스트 한 다음 N x K 데이터 프레임을 만듭니다. 결과 (xdata_train이라고 부릅니다)
  3. xdata_train과 동일한 색인을 사용하여 모든 결과 변수 (내 경우에는 귀하의 의견으로는 연령)를 포함하는 시리즈 (ydata_train이라고 함)를 작성하십시오.
  4. xdata_train을 기반으로 ydata_train을 예측하기 위해 scikit-learn을 통해 임의 포리스트 분류기를 설정하십시오.
  5. scikit-learn의 교차 검증 테스트를 사용하여 매개 변수를 조정하고 정확도를 조정하십시오 (인기 페이지 수, 나무 수, 최소 리프 크기 등)
  6. 무작위 포리스트 분류기 및 피클이있는 가장 인기있는 페이지 목록을 출력하십시오 (또는 모든 것을 한 번에 수행하는 경우 메모리에 보관)
  7. 나머지 데이터를로드하고 인기 페이지 목록을로드하고 (필요한 경우) 2 단계를 반복하여 xdata_new를 생성하십시오.
  8. 임의의 포리스트 분류기를로드하고 (필요한 경우)이를 사용하여 xdata_new 데이터의 값을 예측하십시오.
  9. 예측 점수를 새로운 CSV 또는 선택한 다른 출력 형식으로 출력

귀하의 경우, 회귀 분류기를 교체해야합니다 ( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html 참조 ) 그렇지 않으면 동일한 프로세스 많은 문제없이 작동해야합니다.

또한 파이썬에서 무작위 포리스트의 가장 놀라운 기능인 인스턴트 병렬화를 알고 있어야합니다! R에서이 작업을 시작한 다음 이전 한 사람들은 특히 수십 개의 코어가있는 머신에서 작업 할 때 항상 놀라게됩니다 ( http://blog.yhathq.com/posts/comparing- random-forests-in-python-and-r.html ).

마지막으로, 친구뿐만 아니라 개인에 대한 데이터가있는 경우 네트워크 분석을위한 완벽한 응용 프로그램입니다. 사용자의 친구 연령을 분석 할 수있는 경우, 사용자의 나이는 거의 확실히 1 년 또는 2 년 이내 (특히 사용자가 아직 친구 네트워크를 구축 할 수있을 정도로 친구 네트워크를 구축 할만큼 젊을 경우) 학교 (대부분은 동급생이기 때문에). 이 예측은 모델링에서 얻을 수있는 것보다 우선합니다 .-- 올바른 데이터> 매번 올바른 모델이되는 문제의 교과서 예입니다.

행운을 빕니다!


2
상위 5000 개 사이트를 사용하는 데있어 흥미로운 점 중 하나는 나이에 따라 사용자를 분류하는 데 적합하지 않다는 사실입니다. 건설에 의한 상위 사이트는 모두가 방문하는 사이트입니다. 따라서 가능한 모든 분류 (나이)가 해당 사이트와 관련되어 있으므로 사용자를 분류하는 데별로 좋지 않습니다. 이것은 tf-idf의 idf 부분과 유사한 개념입니다. idf는 "모두가이 기능을 가지고 있습니다"노이즈를 걸러냅니다. 가장 많이 방문한 사이트는 RF를 사용하여 가변 중요도 플롯의 기능으로 어떻게 평가됩니까?
cwharland

1
좋은 지적. 이를위한 쉬운 해결책은 훈련 데이터 세트를 J 연령 빈 (예 : 13-16, 17-20, 21-24 등)으로 계층화하고 각 그룹의 상위 (K / J) 페이지를 가져 오는 것입니다. 그렇게하면 각 그룹에 대해 중요한 표현을 할 수 있습니다. 확실히 그룹간에 약간의 겹침이있을 것이므로 정말로 까다 롭다면 각 그룹마다 상위 (K / J) 고유 페이지를 가져 가고 싶을 수도 있지만 너무 과도하다고 생각합니다.
Therriault

5

또 다른 제안은 로지스틱 회귀 를 테스트하는 것 입니다. 추가 보너스로, 모델의 가중치 (계수)는 어떤 사이트가 연령에 영향을 미치는지에 대한 아이디어를 제공합니다.

Sklearn은 희소 데이터도 처리하도록 설계된 sklearn.linear_model.LogisticRegression 패키지를 제공합니다 .

주석에서 언급했듯이 현재의 경우 샘플보다 많은 입력 변수를 사용하여 모델을 정규화해야합니다 ( sklearn.linear_model.LogisticRegression을 사용하면 penalty='l1'인수 사용 ).


1
LR을 사용하면 연령대에 대해 여러 모델을 만들어야한다고 생각합니다. 사용자를 포함 할 때 동일한 확률을 예측하는 서로 다른 연령대에 대한 두 모델을 어떻게 비교합니까?
cwharland

1
관측치보다 많은 변수가 있으면 LR이 실패하고 모형의 가정이 충족되지 않으면 성능이 저하됩니다. 이를 사용하려면 차원 축소가 첫 번째 단계 여야합니다.
Christopher Louden

1
@cwharland 응답 변수는 본질적으로 연속적이며 문제 정의에 따라 이질화되므로 범주 형으로 간주해서는 안됩니다. 범주 형으로 간주한다는 것은 실제로 17 세일 때 16 세를 예측하는 것이 실제로 17 세일 때 30을 예측하는 것만 큼 심각한 오류라고 알고리즘에 알리는 것을 의미합니다. 계속 고려하면 작은 오류 (16 대 17)가 작고 큰 오류로 간주됩니다 ( 30 대 17)은 큰 것으로 간주됩니다. 이 경우 로지스틱 회귀는 사후 확률을 추정하지 않고 연속 값을 예측하는 데 사용됩니다.
damienfrancois 2014 년

@ChristopherLouden 당신은 로지스틱 회귀의 바닐라 버전이 'large p small n'경우에 적합하지 않다는 것이 맞습니다. 나는 현재 경우에 정규화가 중요하다고 언급 했어야합니다. 답변을 업데이트합니다. 그러나 L1 정규화 LR은 일종의 기능 선택이므로 예비 FS 단계가 필요하지 않습니다.
damienfrancois 2014 년

@ damienfrancois : 나는 분명히 동의합니다. 나는이 경우 LR이 중간 값을 너무 가혹하게 처벌 할 것이라고 우려하고 있습니다. 극단적 인 연령대 값에 관심이 없다는 것을 감안할 때 S 자형 곡선에 매핑하려는 동기는 없습니다. 어쩌면 나는 사용법을 잘못 해석하고 있습니다.
cwharland

4

D. Nguyen 등의 일부 연구 . 트윗을 기반으로 트위터 사용자의 나이를 예측하십시오. 아마도 당신은 그것들이 유용하다고 생각할 것입니다. 로지스틱 및 선형 회귀를 사용합니다.


3

더 멋진 방법 외에도 Bayes 공식을 시도해 볼 수 있습니다.

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

P (I | p1 ... pn)는 사용자가 p1, .., pn을 좋아하면 연령대 I에 속할 확률입니다.

P (i)는 사용자가 연령대 i에 속할 확률입니다.

P (p1 .. pn | i)는 사용자가 연령 그룹 i에 속하는 경우 p1, .., pn을 좋아할 확률입니다.

  • 데이터에서 P (i)에 대한 추정치가 이미 있습니다. 이는 연령 그룹 I의 사용자 비율에 불과합니다.
  • P (p1 ... pn | i)를 추정하기 위해, 각 연령 그룹에 대해 나는 페이지 j를 좋아할 확률 (빈도) p_ij를 추정한다. 모든 j에 대해 p_ij가 0이 아닌 값을 가지려면 전체 가중치의 빈도를 작은 가중치로 혼합 할 수 있습니다.

  • 그런 다음 새 사용자가 좋아하는 모든 페이지에 대한 합계 인 P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn)을 기록합니다. 이 공식은 사용자가 연령 그룹의 페이지를 독립적으로 좋아한다고 가정 할 때 대략 적용됩니다.

  • 이론적으로, 그가 좋아하지 않은 모든 i에 대해 로그 (1-p_ij)를 추가해야하지만 실제로는 로그의 합계 (1-p_ij)가 관련이 적을 것이므로 너무 필요하지는 않습니다. 많은 기억.

본인이나 다른 사람이 시도한 경우 결과에 대해 의견을 말하십시오.


2

이것은 매우 흥미로운 문제입니다.

사용자가 소셜 네트워크에 업로드 한 사진을 분석하여 비슷한 문제에 직면했습니다. 나는 다음과 같은 접근 방식을 수행했다.

  • 내가 한 일은 데이터를 연령대 (15 yo, 27 yo, ...)와 연관시키는 대신 여러 연령대를 설정하는 것입니다 .18 세 미만, 18 세에서 30 세 이상, 30 세 이상 (이것은 직면하지만 원하는 간격을 선택할 수 있습니다). 이 부서는 문제를 해결하는 데 많은 도움이됩니다.
  • 그런 다음 계층 적 클러스터링 (분할 또는 집계)을 만들었습니다. 그런 다음 알려진 연령 (또는 그룹 연령)의 사용자가있는 지점을 선택한 다음 해당 지점에 대해 동일한 연령을 해당 그룹으로 확장했습니다.

이 방법은 반 감독 학습 이며 일부 데이터 만 레이블이있는 경우에 권장합니다.

소셜 네트워크에서 사람들은 일반적으로 나이에 대해 거짓말을합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.