본문 바로가기

데이터 분석

Spark - Collaborative Filtering (영화 추천)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


※ 테스트 요약


수집된 영화 데이터로 추천 모델을 만들고 사용자에게 재미있을 영화를 추천한다.


@@ 혼자 예제 보고 따라한 것임 @@







영화 추천을 위한 데이터 확인


□ 영화 정보 - 영화아이디 | 제목 | 장르


movieId,title,genres
1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji (1995),Adventure|Children|Fantasy
3,Grumpier Old Men (1995),Comedy|Romance
4,Waiting to Exhale (1995),Comedy|Drama|Romance
5,Father of the Bride Part II (1995),Comedy
6,Heat (1995),Action|Crime|Thriller
7,Sabrina (1995),Comedy|Romance
8,Tom and Huck (1995),Adventure|Children
9,Sudden Death (1995),Action
10,GoldenEye (1995),Action|Adventure|Thriller
11,"American President, The (1995)",Comedy|Drama|Romance
12,Dracula: Dead and Loving It (1995),Comedy|Horror
13,Balto (1995),Adventure|Animation|Children
14,Nixon (1995),Drama
15,Cutthroat Island (1995),Action|Adventure|Romance
16,Casino (1995),Crime|Drama
17,Sense and Sensibility (1995),Drama|Romance
18,Four Rooms (1995),Comedy
19,Ace Ventura: When Nature Calls (1995),Comedy
20,Money Train (1995),Action|Comedy|Crime|Drama|Thriller
21,Get Shorty (1995),Comedy|Crime|Thriller
22,Copycat (1995),Crime|Drama|Horror|Mystery|Thriller
...

...






영화 평점 - 아이디번호 | 영화번호 | 점수 | 타임스탬프


userId,movieId,rating,timestamp
1,31,2.5,1260759144
1,1029,3.0,1260759179
1,1061,3.0,1260759182
1,1129,2.0,1260759185
1,1172,4.0,1260759205
1,1263,2.0,1260759151
1,1287,2.0,1260759187
1,1293,2.0,1260759148
1,1339,3.5,1260759125
1,1343,2.0,1260759131
1,1371,2.5,1260759135
1,1405,1.0,1260759203
1,1953,4.0,1260759191
1,2105,4.0,1260759139
1,2150,3.0,1260759194
1,2193,2.0,1260759198
1,2294,2.0,1260759108
1,2455,2.5,1260759113
1,2968,1.0,1260759200
1,3671,3.0,1260759117
2,10,4.0,835355493
2,17,5.0,835355681
2,39,5.0,835355604
2,47,4.0,835355552
2,50,4.0,835355586
2,52,3.0,835356031
2,62,3.0,835355749
2,110,4.0,835355532
2,144,3.0,835356016
2,150,5.0,835355395
2,153,4.0,835355441
2,161,3.0,835355493
2,165,3.0,835355441
2,168,3.0,835355710
2,185,3.0,835355511

...

...

 




데이터 읽기


          SparkSession spark = SparkSession.builder().master("local[4]").appName("ALSExample")
                .config("spark.ui.enabled", "false")
                .config("spark.sql.crossJoin.enabled", "true")
                .config("spark.sql.shuffle.partitions", "8").getOrCreate();
       


         //영화 평점 데이터 로딩

         Dataset<Row> rating =
                  spark.read().format("csv").option("header", "true").option("inferSchema", "true")
                       .load("/home/ksu/Downloads/ml-latest-small/ratings.csv").persist(StorageLevel.MEMORY_ONLY());
        

         //영화 정보 데이터 로딩

         Dataset<Row> movie =
                  spark.read().format("csv").option("header", "true").option("inferSchema", "true")
                       .load("/home/ksu/Downloads/ml-latest-small/movies.csv").persist(StorageLevel.MEMORY_ONLY());
       


         //영화 아이디로 데이터 조인

         Dataset<Row> joins = rating.join(movie, "movieId");
        


         //조인 결과(Eclipse Console)



 





영화 추천


          //8:2 로 학습 데이터와 테스트 데이터로 나눔

         Dataset<Row>[] splits = joins.randomSplit(new double[]{0.8, 0.2});
         Dataset<Row> training = splits[0];
         Dataset<Row> test = splits[1];
        


         //ALS 모델 생성
         ALS als = new ALS().setMaxIter(5)

                                  .setRegParam(0.01)

                                  .setItemCol("movieId")

                                  .setUserCol("userId")

                                  .setRatingCol("rating");
         ALSModel model = als.fit(training);
        


         //평점 데이터 삭제 후 예측    

         Dataset<Row> predictions = model.transform(test.drop("rating"));
        


         //결과(Eclipse Console)

         아이디 516번 유저는 12번 드라큘라 영화의 경우 5점 만점에 3.166의 만족

         전체 데이터 중에 아이디 516번 유저 데이터를 sort하여 높은 점수 추천












'데이터 분석' 카테고리의 다른 글

Spark - Naive Bayes (단어를 이용한 문서 구별)  (0) 2017.05.12
mahout - 설치 및 User 기준 추천  (0) 2017.05.11
Spark - Gaussian Mixture Model Example  (0) 2017.05.01
Spark - K-means  (0) 2017.05.01
머신러닝 유형  (0) 2017.04.28