算法集锦（17） | 推荐系统 | 基于机器学习的商品定价系统

Mercari是日本最大的社区购物应用程序，其深知一个问题，就是想给卖家提供定价建议非常困难。因为卖家可以在Mercari的市场上放置任何东西。

``` 1import gc
2import time
3import numpy as np
4import pandas as pd
5import matplotlib.pyplot as plt
6import seaborn as sns
7from scipy.sparse import csr_matrix, hstack
8from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
9from sklearn.preprocessing import LabelBinarizer
10from sklearn.model_selection import train_test_split, cross_val_score
11from sklearn.metrics import mean_squared_error
12import lightgbm as lgb
13df = pd.read_csv('train.tsv', sep = '\t')```

```1msk = np.random.rand(len(df)) < 0.8
2train = df[msk]
3test = df[~msk]
4train.shape, test.shape
`1train.info()`

`1train.price.describe()`

```1plt.subplot(1, 2, 1)
2(train['price']).plot.hist(bins=50, figsize=(12, 6), edgecolor = 'white', range = [0, 250])
3plt.xlabel('price', fontsize=12)
4plt.title('Price Distribution', fontsize=12)
5plt.subplot(1, 2, 2)
6np.log(train['price']+1).plot.hist(bins=50, figsize=(12,6), edgecolor='white')
7plt.xlabel('log(price+1)', fontsize=12)
8plt.title('Price Distribution', fontsize=12)```

`1train['shipping'].value_counts() / len(train)`

``` 1shipping_fee_by_buyer = train.loc[df['shipping'] == 0, 'price']
2shipping_fee_by_seller = train.loc[df['shipping'] == 1, 'price']
3fig, ax = plt.subplots(figsize=(18,8))
4ax.hist(shipping_fee_by_seller, color='#8CB4E1', alpha=1.0, bins=50, range = [0, 100],
5       label='Price when Seller pays Shipping')
6ax.hist(shipping_fee_by_buyer, color='#007D00', alpha=0.7, bins=50, range = [0, 100],
7       label='Price when Buyer pays Shipping')
8plt.xlabel('price', fontsize=12)
9plt.ylabel('frequency', fontsize=12)
10plt.title('Price Distribution by Shipping Type', fontsize=15)
11plt.tick_params(labelsize=12)
12plt.legend()
13plt.show()```
```1print('The average price is {}'.format(round(shipping_fee_by_seller.mean(), 2)), 'if seller pays shipping');

``` 1fig, ax = plt.subplots(figsize=(18,8))
2ax.hist(np.log(shipping_fee_by_seller+1), color='#8CB4E1', alpha=1.0, bins=50,
3       label='Price when Seller pays Shipping')
5       label='Price when Buyer pays Shipping')
6plt.xlabel('log(price+1)', fontsize=12)
7plt.ylabel('frequency', fontsize=12)
8plt.title('Price Distribution by Shipping Type', fontsize=15)
9plt.tick_params(labelsize=12)
10plt.legend()
11plt.show()```

`1print('There are', train['category_name'].nunique(), 'unique values in category name column')`

`1train['category_name'].value_counts()[:10]`

`1sns.boxplot(x = 'item_condition_id', y = np.log(train['price']+1), data = train, palette = sns.color_palette('RdBu',5))`

LightGBM

• 更快的训练速度和更高的效率
• 降低内存使用
• 更好的精度
• 并行和GPU学习支持
• 能够处理大规模数据

```1NUM_BRANDS = 4000
2NUM_CATEGORIES = 1000
3NAME_MIN_DF = 10
4MAX_FEATURES_ITEM_DESCRIPTION = 50000```

`1print('There are %d items that do not have a category name.' %train['category_name'].isnull().sum())`

`1print('There are %d items that do not have a brand name.' %train['brand_name'].isnull().sum())`

`1print('There are %d items that do not have a description.' %train['item_description'].isnull().sum())`

LightGBM Helper函数:

``` 1def handle_missing_inplace(dataset):
2    dataset['category_name'].fillna(value='missing', inplace=True)
3    dataset['brand_name'].fillna(value='missing', inplace=True)
4    dataset['item_description'].replace('No description yet,''missing', inplace=True)
5    dataset['item_description'].fillna(value='missing', inplace=True)
6def cutting(dataset):
7    pop_brand = dataset['brand_name'].value_counts().loc[lambda x: x.index != 'missing'].index[:NUM_BRANDS]
8    dataset.loc[~dataset['brand_name'].isin(pop_brand), 'brand_name'] = 'missing'
9    pop_category = dataset['category_name'].value_counts().loc[lambda x: x.index != 'missing'].index[:NUM_CATEGORIES]
10def to_categorical(dataset):
11    dataset['category_name'] = dataset['category_name'].astype('category')
12    dataset['brand_name'] = dataset['brand_name'].astype('category')
13    dataset['item_condition_id'] = dataset['item_condition_id'].astype('category')```

```1df = pd.read_csv('train.tsv', sep = '\t')
2msk = np.random.rand(len(df)) < 0.8
3train = df[msk]
4test = df[~msk]
5test_new = test.drop('price', axis=1)
6y_test = np.log1p(test["price"])
7train = train[train.price != 0].reset_index(drop=True)```

```1nrow_train = train.shape[0]
2y = np.log1p(train["price"])
3merge: pd.DataFrame = pd.concat([train, test_new])```

```1handle_missing_inplace(merge)
2cutting(merge)
3to_categorical(merge)```

```1cv = CountVectorizer(min_df=NAME_MIN_DF)
2X_name = cv.fit_transform(merge['name'])
3cv = CountVectorizer()
4X_category = cv.fit_transform(merge['category_name'])```

TF-IDF Vectorize item_description列。

```1tv = TfidfVectorizer(max_features=MAX_FEATURES_ITEM_DESCRIPTION, ngram_range=(1, 3), stop_words='english')
2X_description = tv.fit_transform(merge['item_description'])```

```1lb = LabelBinarizer(sparse_output=True)
2X_brand = lb.fit_transform(merge['brand_name'])```

item_condition_idshipping列创建虚拟变量。

`1X_dummies = csr_matrix(pd.get_dummies(merge[['item_condition_id', 'shipping']], sparse=True).values)`

`1sparse_merge = hstack((X_dummies, X_description, X_brand, X_category, X_name)).tocsr()`

```1mask = np.array(np.clip(sparse_merge.getnnz(axis=0) - 1, 0, 1), dtype=bool)

```1X = sparse_merge[:nrow_train]
2X_test = sparse_merge[nrow_train:]```

`1train_X = lgb.Dataset(X, label=y)`

```1params = {
2        'learning_rate': 0.75,
3        'application': 'regression',
4        'max_depth': 3,
5        'num_leaves': 100,
6        'verbosity': -1,
7        'metric': 'RMSE',
8    }```
• 当我们处理回归问题时，使用“regression”作为应用。
• 使用“RMSE”作为度量，因为这是一个回归问题。
• “num_leaves”=100，因为我们的数据比较大。
• 使用“max_depth”避免过度拟合。
• 使用“冗长”来控制LightGBM的冗长程度(<0:致命)。
• “learning_rate”决定了每棵树对最终结果的影响。

`1gbm = lgb.train(params, train_set=train_X, num_boost_round=3200, verbose_eval=100)`

`1y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)`

```1from sklearn.metrics import mean_squared_error
2print('The rmse of prediction is:', mean_squared_error(y_test, y_pred) ** 0.5)```

0 条评论

• CV新进展 | 迭代视觉推理框架 | 李飞飞团队 | Tensorflow的MNIST案例

陈鑫磊、李佳、李飞飞、Abhinav Gupta等人提出了一种新的迭代视觉推理框架

• 智能家居市场 | 以智能视频监控助力安全放心 | 解读行业

懒人阅读：2016年中国智能家居市场规模达到642.4亿元，预计到2020年，智能家居的市场规模将达到2975.37亿元人民币。用户更注重功能的实用性，安防类智...

• 谷歌Youtube推荐系统及其深度学习技术应用初窥 | 附算法全文下载 | 解读产品

推荐系统将成为 Deep Learning 最重要的应用领域之一。落地场景主要在各个行业的精准营销场景，如电商产品推荐、电影音乐推荐、房屋推荐等。...

• 机器学习项目：使用Python进行零售价格推荐

日本最大的社区购物应用Mercari遇到了一个问题。他们希望向卖家提供定价建议，但这很难，因为他们的卖家能够在Mercari上放置任何东西。

• 动手学深度学习(五) 梯度消失、梯度爆炸

深度模型有关数值稳定性的典型问题是消失（vanishing）和爆炸（explosion）。

• 《模式识别与智能计算》模板匹配法

模板匹配法说白就是特征一一对应，将数据每个特征相差加起来，然后总的特征值最小的就是相似度最大的