今年的美賽在一次又一次的日夜顛倒中結束了,相信每個人,在付出極大努力之後,會有酣暢淋漓的快感,也會認識到自己的不足。
這次的c題是一個純粹的數據挖掘的題
涉及到的 知識有:
- 文本情感分析
- 文本聚類(可選)
- 關聯分析
- 擬合(或者神經網絡預測)
美賽的難點之讀題
看到老美的題,作爲一箇中國人,完全不能做到native speaker,看到題目的那一刻真的有一種“一萬個人心中有一萬個哈姆雷特的感覺”。所以下面我先解讀一下題目,然後提出這個問題的解決思路和相應的代碼。
第一大題:
題目意思是讓你提出指標作爲公司對產品的跟蹤指標,可討論分析的指標很多,自由發揮(並不是讓你一上來就把整個模型建好!)
把各個數據用圖表的形式展現一下,怎麼好看怎麼來。
第二大題:
a題
主要是將文本評價轉化爲量化數據,並融合到star_rating中,地出一個綜合評判一個用戶評價的綜合指標(加權綜合評分)
解決方法和思路:
利用每天的數據計算star_rating的總和,
統計每天往前的評論總數量作爲銷量的代理變量,star_rating的總和/滿分爲好評率
然後可以作圖了:
數據的讀入和處理可以用python的pandas工具,會用的話解決本題將事半功倍:
讀入數據:
data = pd.read_csv('hair_dryer.tsv', sep='\t', header=0)
date = pd.read_csv('day_s.csv', header=0)
day_s.csv 這個文件是自己創建的時間序列,分開來讀取處理數據比較方便,裏面的數據大概是這樣的(這是一小段):
可以使用python或者excel作圖,python的pandas也有畫圖的api,很方便:
最後會出來這樣一張圖,兩條曲線我共用了一個y軸,因此star_rating 這條直線看上去像平的,這是不可取的,應當分別用不同的y軸
b題
觀察時間序列上加權綜合評分的變化情況
怎麼去確定各個量之間的權重呢?
- 主觀賦權法
- 熵權法
- 灰度關聯分析
這一塊我覺得隨便採用哪個都行,也沒有什麼明確的評判標準
還有一個思路是熵權法結合灰度關聯分析
參考一下北京市的一次數學建模比賽:
b題最後也會生成一個綜合評分隨時間的變化圖:
c題
預測產品未來結局
- 可以用神經網絡預測時間時間序列
- 擬合
這裏介紹一下擬合的方法:
方法:擬合綜合評分和時間這兩個量,預測未來一段時間綜合評分的變化。
擬合的方法有很多,可以先試試一階線性擬合,再試試多項式擬合,多項式擬合效果貌似還可以
擬合的代碼:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
# synthesis score regression
def regression_s(product_name):
data = pd.read_csv('total_score/' + product_name + ".csv")
data_x = np.array(data['review_date'])
data_y = np.array(data['total_score'])
x_train, test_x, y_train, test_y = train_test_split(data_x, data_y, test_size=0.33, random_state=1)
x = x_train.reshape(-1, 1)
model = LinearRegression()
model.fit(x, y_train)
test_x = test_x.reshape(-1, 1)
weights = np.polyfit(x_train, y_train, 4)
ans = np.poly1d(weights)
print("y=", ans)
model = np.poly1d(weights)
xp = np.linspace(test_x.min(), test_x.max(), 70)
pred_plot = model(xp)
pred = model(test_x)
plt.scatter(test_x, test_y, facecolor='blue', edgecolor='blue')
plt.plot(xp, pred_plot, color='red')
plt.title("synthesis score regression")
plt.ylabel(product_name + ' synthesis score')
plt.savefig('total_score/' + product_name + '.png', dpi=200, bbox_inches='tight')
plt.show()
MAE = mean_squared_error(test_y, pred.flatten())
MSE = mean_absolute_error(test_y, pred.flatten())
print("MSE", MSE)
print("MAE", MAE)
if __name__ == '__main__':
regression_s("hair_dryer")
d題
這個的解題思路也很簡單,對於每個時間點,都會有一個對應的綜合評分,對於這個時間點後的一個月,也有一個綜合評分,兩個總和評分算關聯繫數即可(當然可以多取幾個月,比如取之後的一個月,兩個月,一直到十二個月)
這個指標不一定用綜合評分,也可以用當月平均星級來求關聯繫數,如圖:
e題
考察文本打分和star_rating的相關性,直接用star_rating和對評論的打分做相關係數就行,這題應該是最簡單的了吧。
最後說一下怎麼算相關係數:
python的pandas庫裏有一個函數 pd.DataFrame.corr()
這個函數提供了計算相關係數的接口:
DataFrame.corr(method=‘pearson’, min_periods=1)
參數說明:
-
method:可選值爲{‘pearson’, ‘kendall’, ‘spearman’}
-
min_periods:樣本最少的數據量
返回值:各類型之間的相關係數DataFrame表格。
當然還有別的方法,但是做數據挖掘這塊,pandas是必不可少的工具。
總結
做這種類型的題,思路簡單,但是實現起來需要有一定的數據挖掘方面的知識
一個很重要的工具:pandas
另外建議學習一下numpy
學會這兩個,這種題以後應該能分分鐘拿下了吧。
返回值:各類型之間的相關係數DataFrame表格。
當然還有別的方法,但是做數據挖掘這塊,pandas是必不可少的工具。
總結
做這種類型的題,思路簡單,但是實現起來需要有一定的數據挖掘方面的知識
一個很重要的工具:pandas
另外建議學習一下numpy
學會這兩個,這種題以後應該能分分鐘拿下了吧。
公衆號:“文化人愛讀水許傳”