File size: 1,836 Bytes
33e1108
 
 
ce1fcc3
33e1108
 
ce1fcc3
33e1108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from surprise import SVDpp
from surprise import Dataset
from surprise import Reader
import streamlit as st
import pandas as pd
import pickle


def predict():
    with open('./model.pkl', 'rb') as f:
        model = pickle.load(f)

    titles = pd.read_csv('./amazon-books-titles.csv')
    predictions = []
    for row in titles.iterrows():
        predictions.append({'title': row[1]['title'], 'rating': model.predict(x, row[1]['asin']).est})
    sorted_predictions = sorted(predictions, key=lambda p: -p['rating'])
    st.write(pd.DataFrame(sorted_predictions))


def train_model():
    books = pd.read_csv('./amazon-books.zip')
    titles = pd.read_csv('./amazon-books-titles.csv')

    current_user_book_ids = titles[titles['title'].isin([t.strip() for t in y])]['asin'].values
    current_user_ratings = pd.DataFrame({
        'reviewerID': [x] * len(current_user_book_ids),
        'asin': current_user_book_ids,
        'overall': [5] * len(current_user_book_ids)
    })
    st.write(current_user_ratings)

    books = books.append(current_user_ratings)

    data = Dataset.load_from_df(books[['reviewerID', 'asin', 'overall']], Reader(line_format='user item rating', rating_scale=(1, 5)))
    trainset = data.build_full_trainset()
    best_params = {
        'n_epochs': 15,
        'lr_all': 0.004760245463611792,
        'reg_all': 0.40040712444861504,
        'random_state': 42
    }
    
    algo = SVDpp(**best_params)
    algo.fit(trainset)

    with open('./model.pkl', 'wb') as f:
        pickle.dump(algo, f)


with open('./titles.txt', 'r', encoding='utf8') as f:
    options = f.readlines()

x = st.text_input('uid')

y = st.multiselect('Select book', options)

btn = st.button('Submit', on_click=train_model)

btn2 = st.button('Predict', on_click=predict)