今年的美赛在一次又一次的日夜颠倒中结束了,相信每个人,在付出极大努力之后,会有酣畅淋漓的快感,也会认识到自己的不足。
这次的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
学会这两个,这种题以后应该能分分钟拿下了吧。
公众号:“文化人爱读水许传”