gender
, age
, age_o
, race
, race_o
: 성별, 나이, 상대방 나이, 종교, 상대방 종교importance_same_race
: 같은 인종이어야 하는 것에 대해서 얼마나 중요하게 생각하는지importance_same_religion
: 같은 종교여야 하는 것에 대해서 얼마나 중요하게 생각하는지pref_o_...
: 상대방 정보, 뒤에 붙는 항목을 얼마나 중요하게 생각하는지를 점수화(모든 점수의 합이 100이 되도록 분배)..._o
: 각 항목에 대한 상대방의 평가..._important
: 본인이 생각했을 때 각 항목이 얼마나 중요한지_partner
: 파트너에 대한 평가interests_correlate
: 취향 유사도(상관관계로 표현)expected_happy_with_sd_people
: 이벤트에 대한 기대 정도expected_num_interested_in_me
: 나에게 관심을 보이는 정도like
: 상대방이 얼마나 좋았는지 점수로 표현guess_prob_liked
: 상대방이 나에게 몇 점을 주었을지 표현match
: 커플 성사 여부match
: 예측해야 할 종속 변수10줄을 보면, gender와 age, race 동일 -> 상대방 정보만 바뀜. -> 동일인인건지 살펴봐야 함.
importance_same_race, importance_same_religion 역시 동일
그 외에도 확률에 대한 분포값들이(데이터들이) 동일함.
20개를 확인해보니 확실히 10개 행 단위로 한 명의 사람임을 알 수 있음.
Missing Value 다수 존재
대부분이 숫자형 데이터 -> object 데이터만 잘 살펴보면 될 듯
데이터 타입에는 문제가 없음을 알 수 있음.
1~10까지의 값에서 이상한 값 발견 -> 정리 필요
'단어'.startswith('알파벳')
: 단어가 그 알파벳으로 시작하는지
'단어'.endswith('알파벳')
: 단어가 그 알파벳으로 끝나는지
-_o로 끝나는 부분이 변환되어서 의도치 않은 변경이 일어남.
🚨 중요 : 머신러닝 학습 시 종속변수에 결측치가 존재한다면 그 결측치는 무조건 DROP해야 함.
- 최빈값, 평균값 등으로 채울 수 없음.
- 종속 변수는 정답값이기 때문에 노이즈 이상으로 잘못된 데이터가 될 수 있음!!
- 독립 변수는 노이즈를 감수하고 대체 가능
'o_important' or 'i_important'로 시작하는 컬럼명 -> drop_cols
리스트로 저장
저장한 drop_cols
를 드랍
결과
이렇게 처리할 수 있는 이유
- object 컬럼(gender, race, race_o)의 결측치가 없음.
- 숫자형 컬럼에만 결측치가 있음.
-99와 같은 수치를 넣고 -> 선형 모델을 쓰면 안됨!
- 선형 모델에서는 그 수치를 굉장히 좋지 않고 낮은 것으로 받아들임.
- 선형 모델은 숫자의 크고 작음에 많이 민감하기 때문.
- 트리 기반 모델은 선형 모델보다 덜 민감.
수치 다시 한번 확인
o_score_attractive
o_score_funny
import 관련 컬럼 6개 합이 100 미만 또는 100 초과하는 케이스도 정리
o_important로 시작하는 컬럼명 모아서 리스트에 저장
100이 아닌 수치 찾기 -> o_imp_sum으로 저장
i_impotant도 동일하게 진행
확인
합이 100이 아닌 경우 찾기
해결 방법 : 강제로 합이 100이 되게끔 가중치를 부여!
95였던 합이 100으로 맞춰짐(i, o 모두 진행)
이제 필요없어진 o_imp_sum, i_imp_sum 다시 드랍
결측치가 있었다는 문제가 있었고 -> -99로 채웠음.
바로 계산 시 음수값들이 나올 것임.
나이 부분에 -99 값이 있을 경우 -> 나이차도 -99로 정리
나이차가 남자가 더 많은지, 여자가 더 많은지에 따라서도 변수가 될 수 있음.
+, -는 어느쪽의 나이가 더 많은지에 대해서 표시한 것 -> 그러나 컴퓨터 입장에서는 -로 갈수록 나이차가 계에속 더더더더 적어진다고만 생가할 것임.
별도 컬럼을 만들어 남녀 구분이 가능하도록 할 것.
절대값 처리(구분한 컬럼을 만들었으니까)
값 확인 : 나이차 적용이 잘 되었는지 확인하기
결측치 처리를 했고, 드랍을 했기 때문에 -99같은 값은 없을 것.
같은 인종인지 여부 -> same_race
로 저장
same_race에 importance_same_race를 곱해주면
하지만, 인종이 다른 경우는 무조건 0이 곱해지는 문제 발생
same_race의 0 부분을 -> -1로 변경해서 의도한 값이 나오도록!
- 0 값을 -1로 조정
상대방에게 준 점수를 수치화하는데 더 유의미한 결과가 나올 것.
🚨주의 : score에는 -99로 결측치를 채워준 부분이 있음.
즉, -99가 포함되었을 경우 ➡️ -99로 계산 결과값이 나오도록 조정
리스트 모아주기
참고 : zip 함수 사용법
o_rating, i_rating에 들어갈 컬럼명 지정
o_rating
계산 결과를 -> o_rating, i_rating으로 저장
확인
i_rating
각 rating 평균값 구하기
더 고려할 부분
- rating 점수의 0점
- score가 0점이거나 important 부분이 0인 경우가 있음.
- 중요도가 0이라면 -> 중요하지 않게 생각하니 0으로 들어가는게 맞음.
- 하지만 10점을 줬지만, 중요하지 않아서 0점이 된 경우 -> 계산에서 제외되는 것이 맞음!
바로 평균을 구하는 코드를 전체에 적용하기보단, test를 해보고 이해한다음 코드를 잘 써서 적용해보자.
8377번(-99가 3개 있음)으로 test
dating_df[i_rating].loc[8377][dating_df[i_rating].loc[8377] > 0].mean()
이 개념을 통해 평균 코드 일반화해 작성하기
head(), tail()로 다시 확인
🧐 조합 평균이란?
- 두 값이 비슷할수록 -> 평균값이 높게 측정됨.
- 조합 평균 구하는 방법 :
2 * 데이터1 * 데이터2 / (데이터1 + 데이터2)
dating_df['rating_mean'] = 2 * dating_df['o_rating_total'] * dating_df['i_rating_total'] / (dating_df['o_rating_total'] + dating_df['i_rating_total'])
위의 제외 컬럼 빼고 아래 사진(gender, age...등등 기본은 물론 무조건 유지!)
계산
same_race도 삭제
same_race_point만 잘 남은 것 확인 완료
기본 사용 방법
함수 정의
script로 등록
파일 저장(루드 폴더에 src 폴더 미리 생성)
FileNotFoundError
import os
os.makedirs('./src', exist_ok=True)
스피딩 데이터 파일에 적용
col_rename
으로 저장./aiffel/src에 저장되었는지 확인
test.py
- 컬럼 이름이 잘 반영되지 않았는데? -> 해당 코드가 빠져서 그런 것
- 그런데... 피처 엔지니어링이 끝난 데이터면..이미 위 함수들을 다 거쳐온 데이터 아닌가...? 근데 이게 적용이 되는지 확인할 수 있어..?
아무래도 원본 데이터가 맞는거 같음...!
- 거기에서 match만 드랍해서 new_dating2.csv로 저장해서 쓰자.
- 그리고 모든 새로운 함수 등록 시 -> 커널 재시작 + 셀 모두 재실행해서 적용할 것!
10 초과값 -> 10으로 정리 파트
합 100 만들기 파트