# 建模实现
# 目标:对电影进行分类预测
# 电影的哪些属性对电影的类别有影响.
# 建模:首先要考虑的就是哪些属性对我们研究的目标是可能有影响的
# 思考:如何对电影进行分类预测
# 假设电影分为两类:动作电影 和 爱情电影
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
data=pd.read_excel("电影预测问题.xlsx",sheet_name=0)
data
电影名称 | 打斗镜头 | 接吻镜头 | 类别 | |
---|---|---|---|---|
0 | 黄飞鸿 | 10 | 2 | 动作 |
1 | 泰塔尼克号 | 3 | 9 | 爱情 |
2 | 钢铁侠 | 12 | 3 | 动作 |
3 | 后会无期 | 4 | 10 | 爱情 |
4 | 星语心愿 | 1 | 8 | 爱情 |
5 | 通天教主 | 9 | 1 | 动作 |
6 | 加勒比海盗 | 11 | 2 | 动作 |
7 | 天下无贼 | 13 | 3 | 动作 |
8 | 同桌的你 | 2 | 7 | 爱情 |
9 | 天气之子 | 3 | 11 | 爱情 |
10 | 变形金刚 | 13 | 2 | 动作 |
y = data["类别"]
x = data[["打斗镜头","接吻镜头"]]
#特征空间:由样本集的数据的特征展开的空间
x
打斗镜头 | 接吻镜头 | |
---|---|---|
0 | 10 | 2 |
1 | 3 | 9 |
2 | 12 | 3 |
3 | 4 | 10 |
4 | 1 | 8 |
5 | 9 | 1 |
6 | 11 | 2 |
7 | 13 | 3 |
8 | 2 | 7 |
9 | 3 | 11 |
10 | 13 | 2 |
y.map({"动作":0,"爱情":1})
0 0
1 1
2 0
3 1
4 1
5 0
6 0
7 0
8 1
9 1
10 0
Name: 类别, dtype: int64
plt.scatter(x["打斗镜头"],x["接吻镜头"],c = y.map({"动作":0,"爱情":1}))
<matplotlib.collections.PathCollection at 0x24b4a8699d0>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NnVbAs1f-1661069258396)(output_7_1.png)]
action = x.loc[y == "动作"]
love = x.loc[y == "爱情"]
action
打斗镜头 | 接吻镜头 | |
---|---|---|
0 | 10 | 2 |
2 | 12 | 3 |
5 | 9 | 1 |
6 | 11 | 2 |
7 | 13 | 3 |
10 | 13 | 2 |
colors = sns.color_palette("husl")
sns.palplot(colors)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cyidJj7-1661069258398)(output_9_0.png)]
plt.scatter(action["打斗镜头"],action["接吻镜头"],marker ="+",s =180,color = colors[2],label = "action")
plt.scatter(love["打斗镜头"],love["接吻镜头"],marker ="*",s =180,color = colors[4],label = "love")
plt.legend()
plt.xlabel("action",color = colors[2],fontsize = 20)
plt.ylabel("love",color = colors[4],fontsize = 20)
Text(0, 0.5, 'love')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUQ73v16-1661069258399)(output_10_1.png)]
#在特征空间中,我们发现不同类别的电影的距离会更加接近
# KNN ( K nearest neighbors)
# 在特征空间中,计算出距离带预测样本点的最近的k个样本,由这k个样本投票产生预测结果
from sklearn.neighbors import KNeighborsClassifier
#n_neighbors 就是k值的个数,分类问题一般会选择奇数而不是偶数
knn = KNeighborsClassifier(n_neighbors=3)
y
0 动作
1 爱情
2 动作
3 爱情
4 爱情
5 动作
6 动作
7 动作
8 爱情
9 爱情
10 动作
Name: 类别, dtype: object
#把标签数值化处理
target = y.map({"动作":0, "爱情":1})
target
0 0
1 1
2 0
3 1
4 1
5 0
6 0
7 0
8 1
9 1
10 0
Name: 类别, dtype: int64
#算法对象需要被训练,被数据样本集训练,才能具有预测能力
knn.fit(x,target)
KNeighborsClassifier(n_neighbors=3)
#knn算法对象被训练之后,就成为一个模型对象,模型对象可以预测未知的数据的属性
film=np.array([[10,2],[15,5],[6,2]])
knn.predict(film)
array([0, 0, 0], dtype=int64)
plt.scatter(action["打斗镜头"],action["接吻镜头"],marker ="+",s =180,color = colors[2],label = "action")
plt.scatter(love["打斗镜头"],love["接吻镜头"],marker ="*",s =180,color = colors[4],label = "love")
plt.legend()
plt.xlabel("action",color = colors[2],fontsize = 20)
plt.ylabel("love",color = colors[4],fontsize = 20)
plt.scatter(film[:,0],film[:,1],c= knn.predict(film))
<matplotlib.collections.PathCollection at 0x24b4e545a00>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1lDsMftQ-1661069258400)(output_20_1.png)]