学习机器学习很久了,最近也一直从事相关工作。这里通过电影票房预测来和大家,了解机器学习处理的一般流程。
数据集为kaggle上的tmdb5000的电影数据集,算法使用的是相对容易理解的knn算法。硬件则是普通的笔记本。
相关包的引入
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier
这里选择的是文件读取的方式,当然获取数据的方式是多样的。从数据库或者数仓读取的方式也是较为常见的。
data = pd.read_csv("/home/dada/myprokect/tmdb_5000_movies.csv")
我们来大致看一眼数据
data.head()
可以看到数据维度还是比较多的,我们需要对数据进行基处理。
大致查看了一下数据,发现数据中除了有空值外,还有一些值以0的形式出现,我们先把这些值替换为空值。
data = data.replace(0, np.nan)
接着是为出现空值的行去掉
data = data.dropna(axis=0, how="any")
我们先提取特征值
feature_arr = data[['budget','popularity','runtime', 'vote_average', 'vote_count']].values
我们想通过’budget’(投资),‘popularity’(热度),‘runtime’(电影时长), ‘vote_average’(评分), ‘vote_count’(评分人数)这几个维度进行票房预测。
我们的标签值,也就是我们要预测的那个值,这里指的是电影的票房。
我们先将数据提取出来。
tag_arr = data['revenue']
我们可以大致看一下数据
0 2.787965e+09 1 9.610000e+08 2 8.806746e+08 3 1.084939e+09 4 2.841391e+08 ... 4752 4.164980e+05 4758 6.008960e+05 4772 1.000000e+04 4773 3.151130e+06 4796 4.247600e+05 Name: revenue, Length: 1248, dtype: float64
由于这个标签值是连续型,也就是具体的值。我们此次使用的算法是k近邻分类算法。所以我们这里要略做处理。
我们通过pandas的分箱方法,把票房值转换为具体的高中低值。
tag_arr = np.array(pd.qcut(data['revenue'],3, labels=['低', '中', '高']))
array(['高', '高', '高', ..., '低', '低', '低'], dtype=object)
x_train, x_test, y_train, y_test = train_test_split(feature_arr, tag_arr)
这里将数据分割为训练数据集与预测数据集,这里是默认7比3的方式。当然我们也可以自我选择分割比例。
特征工程就对特征进行一些预处理操作,我们的训练特征均是连续型的,所以这里无需过多进行处理。这里只是对数据进行正则化转换,即把各个维度的数值拉到一个正态化的区间。
sklearn提供了相应的接口,我们可以轻松的调用。
transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test)
revenue_predict = KNeighborsClassifier(n_neighbors=5)
revenue_predict.fit(x_train, y_train)
print("预测结果:\n", y_pre)
预测票房结果: ['低' '中' '中' '中' '低' '中' '高' '高' '中' '高' '中' '低' '低' '高' '中' '高' '高' '中' '低' '低' '中' '中' '中' '高' '高' '低' '低' '高' '高' '高' '中' '中' '低' '低' '低' '高' '中' '中' '中' '高' '低' '高' '中' '中' '中' '高' '低' '高' '低' '中' '中' '低' '高' '中'......
print("预测值和真实值的对比是:\n", y_pre==y_test)
预测值和真实值的对比是: [ True True True True True True True False True True True True True False False True True True True True True True True True False False True True True True False False False True True True......
score = revenue_predict.score(x_test, y_test) print(score)
0.7883333333333334
下面我们可以看准确度是否满足咱的需要我们的业务,我们可以更换超参数或者更换机器学习算法来提高准确度。
其实这里选用分类算法去预测票房不是特别合理,当然这篇博客只是一个机器学习流程的入门。希望没有入门机器学习的同学可以得到一些启发。