.Net上のリコメンダーシステムまたはMyMediaLiteを使用した最初のステップ

 ,    ? :)



友達の推薦でBigDataコースに行ったことがありますが、幸運にもこのコンテストに参加できました。 コースのトレーニングについては説明しませんが、.NetのMyMediaLiteライブラリとその使用方法について説明します。



前戯



鼻には最後の実験室作業がありました。 コースを通して、私は実験室での仕事で特に競争することはしませんでした;終わりに近づくと、私の人生は競争を余儀なくされました-証明書を取得するために、私はポイントを獲得しなければなりませんでした。 最後の講義はあまり有益ではなく、むしろ復習であり、時間を無駄にしないと同時に、最後のラボを行うことにしました。 残念ながら、その時点では、Apache Sparkがインストールされた独自のクラスターはありませんでした。 トレーニングクラスターでは、全員が研究室を急いでいるため、成功のチャンスとリソースはほとんどありませんでした。 私の選択は、C#.NetのMyMediaLiteでした。 幸いなことに、2つのCPUと16 GbのRAMを備えた、負荷が高く実験用に割り当てられていないかなり良好な動作中のサーバーがありました。



タスク条件



次のデータが提供されました。





テーブルtest.csvの映画の評価を予測し、userId、movieId、評価の形式のデータを含む結果ファイルを生成し、チェッカーにアップロードする必要があります。 推奨事項の品質はRMSEによって評価され、オフセットが0.9(これ以上ではない)になることはありません。 次は最良の結果を得るための闘争です。



すべてのデータファイルはhttps://goo.gl/iVEbfAから入手できます

RMSEの読み方に関する素晴らしい記事



私の決断



コードの最新バージョンはgihabaで入手できます。



さて、誰が知性なしで戦いに出ますか? 「インテリジェンスデータ」は講義の休憩中に取得されたため、他のデータセットを追加して、悪名高い映画レンズ1mを滑らせたことがわかりました。 既にラボをマスターしている人は、 SVD ++を称賛しました。



原則として、機械学習は3つの部分で構成されます。





私もこの方法で、サンプルをそれぞれ70%と30%の2つの部分に分けました。 サンプルの2番目の部分は、モデルの精度を検証するために必要です。 コードの非常に最初のバージョンが作成され、その結果、実験室の作業は正常に合格しました。 結果は、 BiasedMatrixFactorizationモデルで0.880360573502です。 彼はすぐにすべての見掛け倒しをタグとリンクで一掃し、それらをより良い結果を得るための追加機能として使用することができました。 私はそれに時間を費やさなかったし、それは正しい決断でした、私見。 トレーニングセットを欠席したユーザーも大胆に無視され、BiasedMatrixFactorizationクラスによって返された不明な値によって評価が与えられました。 これは重大な間違いでした。 SVD ++モデルでは、結果は0.872325203952でした 。 チェッカーが最初の場所を示し、私は落ち着いた魂を持って勝者のスピーチをリハーサルし、寝ました。 しかし、彼らが言うように、鶏は秋に数えられます。



競技結果



簡単に説明しますが、勝利の場所は何度か手から手に渡りました。 その結果、締め切りの時点で、私の友人は1位になり、私は2位になりました。 私たちプログラマー-頑固な人々は、まだBiasedMatrixFactorizationで最高の結果を絞り出すことができました 。 悲しいかな、締め切り後。



画像



代替ソリューション



私の友人wenkは 、1位を獲得し、彼のコードを提供してくれました。 彼のソリューションは、scikit-learnのALSを使用して、Apache Sparkのクラスターに実装されました。



# coding: utf-8 # In[1]: import os import sys os.environ["PYSPARK_SUBMIT_ARGS"]=' --driver-memory 5g --packages com.databricks:spark-csv_2.10:1.1.0 pyspark-shell' sys.path.insert(0, os.environ.get('SPARK_HOME', None) + "/python") import py4j from pyspark import SparkContext,SparkConf,SQLContext conf = (SparkConf().setMaster("spark://bd-m:7077") .setAppName("lab09") .set("spark.executor.memory", "50g") .set("spark.driver.maxResultSize","5g") .set("spark.driver.memory","2g") .set("spark.cores.max", "26")) sc = SparkContext(conf=conf) sqlCtx = SQLContext(sc) # In[2]: ratings_src=sc.textFile('/lab10/train.csv',26) ratings=ratings_src.map(lambda r: r.split(",")).filter(lambda x: x[0]!='userId').map(lambda x: (int(x[0]),int(x[1]),float(x[2]))) ratings.take(5) # In[3]: test_src=sc.textFile('/lab10/test.csv',26) test=test_src.map(lambda r: r.split(",")).filter(lambda x: x[0]!='userId').map(lambda x: (int(x[0]),int(x[1]))) test.take(5) # In[4]: from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel from pyspark.mllib.recommendation import Rating rat = ratings.map(lambda r: Rating(int(r[0]),int(r[1]),float(r[2]))) rat.cache() rat.first() # In[14]: training,validation,testing = rat.randomSplit([0.6,0.2,0.2]) # In[15]: print training.count() print validation.count() print testing.count() # In[16]: training.cache() validation.cache() # In[17]: import math def evaluate_model(model, dataset): testdata = dataset.map(lambda x: (x[0],x[1])) predictions = model.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2])) ratesAndPreds = dataset.map(lambda r: ((r[0], r[1]), r[2])).join(predictions) MSE = ratesAndPreds.map(lambda r: (r[1][0] - r[1][1])**2).reduce(lambda x, y: x + y) / ratesAndPreds.count() RMSE = math.sqrt(MSE) return {'MSE':MSE, 'RMSE':RMSE} # In[12]: rank=20 numIterations=30 # In[28]: model = ALS.train(training, rank, numIterations) # In[ ]: numIterations=30 lambda_=0.085 ps = [] for rank in range(25,500,25): model = ALS.train(training, rank, numIterations,lambda_) metrics = evaluate_model(model, validation) print("Rank = " + str(rank) + " MSE = " + str(metrics['MSE']) + " RMSE = " + str(metrics['RMSE'])) ps.append((rank,metrics['RMSE'])) # In[10]: ls = [] rank=2 numIterations = 30 for lambda_ in [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]: model = ALS.train(training, rank, numIterations, lambda_) metrics = evaluate_model(model, validation) print("Lambda = " + str(lambda_) + " MSE = " + str(metrics['MSE']) + " RMSE = " + str(metrics['RMSE'])) ls.append((lambda_,metrics['RMSE'])) # In[23]: ls = [] rank=250 numIterations = 30 for lambda_ in [0.085]: model = ALS.train(training, rank, numIterations, lambda_) metrics = evaluate_model(model, validation) print("Lambda = " + str(lambda_) + " MSE = " + str(metrics['MSE']) + " RMSE = " + str(metrics['RMSE'])) ls.append((lambda_,metrics['RMSE'])) #Lambda = 0.1 MSE = 0.751080178965 RMSE = 0.866648821014 #Lambda = 0.075 MSE = 0.750219897276 RMSE = 0.866152352232 #Lambda = 0.07 MSE = 0.750033337876 RMSE = 0.866044651202 #Lambda = 0.08 MSE = 0.749335888762 RMSE = 0.865641894066 #Lambda = 0.09 MSE = 0.749929174577 RMSE = 0.865984511742 #rank 200 Lambda = 0.085 MSE = 0.709501168484 RMSE = 0.842318923261 get_ipython().run_cell_magic(u'time', u'', u'rank=400\nnumIterations=30\nlambda_=0.085\nmodel = ALS.train(rat, rank, numIterations,lambda_)\npredictions = model.predictAll(test).map(lambda r: (r[0], r[1], r[2]))') # In[7]: te=test.collect() base=sorted(te,key=lambda x: x[0]*1000000+x[1]) # In[8]: pred=predictions.collect() # In[9]: t_=predictions.map(lambda x: (x[0], {x[1]:x[2]})).reduceByKey(lambda a,b: dict(a.items()+b.items())).collect() t={} for i in t_: t[i[0]]=i[1] s="userId,movieId,rating\r\n" for i in base: if t.has_key(i[0]): u=t[i[0]] if u.has_key(i[1]): s+=str(i[0])+","+str(i[1])+","+str(u[i[1]])+"\r\n" else: s+=str(i[0])+","+str(i[1])+",3.67671059005\r\n" else: s+=str(i[0])+","+str(i[1])+",3.67671059005\r\n" # In[12]: text_file = open("lab10.csv", "w") text_file.write(s) text_file.close()
      
      







私の経験



私自身のために、いくつかの事実に注目しました。





ああ、もし私がこれをすべて知っていたら、私は勝者になるだろう...私はあなたの意見やアドバイス、友人に感謝します、たくさん蹴らないでください...



All Articles