brunch

매거진 Spark+Python

You can make anything
by writing

C.S.Lewis

by 보나벤투라 Nov 14. 2017

데이터 병합 & 피처 엔지니어링(파생 특징)

사용자, 영화, 평점 데이터셋 

http://files.grouplens.org/datasets/movielens/ml-100k.zip

실습 데이터 : 사용자들이 영화에 대해 매긴 점수와 관련된 100k 데이터 집합

[root@client_server ~]# vi $SPARK_HOME/conf/spark-env.sh

export PYSPARK_DRIVER_PYTHON=/root/anaconda3/envs/py35/bin/ipython3

[root@client_server ~]# $SPARK_HOME/bin/pyspark --master spark://master:7077

pyspark를 아이 파이썬 콘솔 기능으로 사용 가능!



[root@client_server ~]# cd dataset/ml-100k

[root@client_server ~]# ls

[root@client_server ~]# head -3 u.user #추출할 데이터 형태 확인

[root@client_server ~]# head -3 u.data #추출할 데이터 형태 확인

[root@client_server ~]# head -3 u.item #추출할 데이터 형태 확인

필요한 사용자, 영화, 평점 데이터프레임 형성하기

>> user=sc.textFile("u.user").map(lambda x:x.split("|")).map(lambda x:x[:4]).collect()

>> rating=sc.textFile("u.data").map(lambda x:x.split("\t")).map(lambda x:x[:3]).collect()

>> movie=sc.textFile("u.item").map(lambda x:x.split("|")).map(lambda x:x[:2]).collect()

>> import pandas as pd

>> colnames1=["user_id","age","gender","occupation"]    

>> colnames2=["user_id","movie_id","rating"]

>> colnames3=["movie_id","movie_name"]

>> user_df=pd.DataFrame(user,columns=colnames1) ;user_df.head(3)

>> rating_df=pd.DataFrame(rating,columns=colnames2) ;rating_df.head(3)

>> movie_df=pd.DataFrame(movie,columns=colnames3) ;movie_df.head(3)

사용자, 영화, 평점 데이터셋 병합

>> merge_df=pd.merge(user_df,pd.merge(movie_df,rating_df,how="inner"),how="inner") #merge by "movie_id" and  "user_id"

>> merge_df.columns

>> merge_df=merge_df.iloc[:,[0,1,2,3,6,4,5]] #iloc는 integer로 indexing /loc는 label로 indexing

>> merge_df.describe()

>> merge_df["rating"]=pd.to_numeric(merge_df["rating"]) #파생특징 추출 위해, 숫자로 형변환

파생 특징 추출(Feature Engineering)

#사용자별 성별 "평점 평균, 평점 분산(호불호 정도), 영화 관람 횟수(관심도)" 구하기

1. mean(평점 평균) : 관람객의 '영화에 대한 만족 정도 또는 그 기준'을 측정

2. var(평점 분산) : 관람객의 '영화에 대한 호불호 정도'를 측정

3. size(영화 평점부여 횟수) : '영화에 대한 관심도, 즉 라이프스타일'을 측정


>> group=merge_df.groupby(["user_id","gender"]).agg([np.mean,np.var,np.size])

>> group.columns=group.columns.get_level_values(1) #remove multi index

>> group=group.reset_index() #change multi index to be columns

  이 포스트에서는 피처 엔지니어링의 한 예로써, 파생 특징을 들었지만 이 뿐만 아니라 숫자(관람자 연령), 카테고리(관람자 성별 및 직업, 영화 장르), 텍스트 특징(영화 제목, 리뷰 등) 또한 있습니다. 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari