python:机器学习(KNN模型训练)(二)

机器学习:KNN模型训练及应用

承上:(sklearn)
可通过调节邻居数(n_neighbors为奇数)和测试集比重(test_size)改变测试结果的准确率

KNN算法
最简单机器学习算法之一
KNN是分类算法
分类问题:如果-一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别;则该样本也属于这个类别。(近朱者赤,近墨者黑)

python:机器学习(KNN模型训练)(二)_第1张图片
绿色(K为邻居数)为样本最多邻居为蓝三角所以样本为蓝三角

是否出门问题:y设为花销,x设为天气指数
黄点为当前样本,设邻居数k=3
python:机器学习(KNN模型训练)(二)_第2张图片
距离样本最近的三点去的多,样本结果去的概率最大

KNN算法选择

  • 优点:
    1、准确度高,对异常点不敏感
    2、理论成熟,思想简单
  • 缺点:
    1、样本数据偏移会导致分类失败
    2、计算量较大,对每一个样本都要计算它和全体的距离,才能得到K个最近邻点

创建KNN模型

数据处理

# 数据加载
iris = load_iris()
# 二维——花萼长,花萼宽,花瓣长,花瓣宽
pd_data = pd.DataFrame(iris["data"],columns=iris.feature_names)
# 加入标签
pd_data["label"]=iris.target
# 数据打乱
df = shuffle(pd_data)
# 索引重新排序
df.reset_index(drop=True,inplace=True)
# 数据分割(行)
# 特征————前四列 标签
x=df.iloc[:,:4].values
# 拍平 多维转一维
y=np.ravel(df.iloc[:,-1:].values)
print(y,y.shape,type(y))

构建

# 测试集 20%
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=6)
# k小于数据个数的平方根
best_k = -1
best_p = 1
# 最高评分
best_score = 0
W = ['uniform','distance']
weight = ''

for k in range(3,13):
    # 求和次方数
    for p in range(1,8):
        for w in W:
            # 每一个k对应模型创建出来
            # 创建算法 创建邻居数
            knn_model = KNeighborsClassifier(n_neighbors=k,p=p,weights=w)
            # 构建基于训练集的模型
            knn_model.fit(x_test,y_test)
            # 模型评分
            score = knn_model.score(x_test,y_test)
            if best_score

结果
python:机器学习(KNN模型训练)(二)_第3张图片
模型保存

joblib.dump("knn_iris.model",knn_model)

模型调优:
方法1:超参调试

param_list = [{
    "n_neighbors":list(range(1,4)),
    "weights":['uniform','distance'],
    "p":list(range(1,6))
}]
knn_model = KNeighborsClassifier()
grid = GridSearchCV(knn_model,param_list,cv=4)
grid.fit(x_train,y_train)
print(grid.best_estimator_)
print(grid.best_score_)
print(grid.best_params_)

获得最优模型
python:机器学习(KNN模型训练)(二)_第4张图片
最优解代入

 knn_model = KNeighborsClassifier(n_neighbors=2,p=3,weights='uniform')
knn_model.fit(x_train,y_train)
 score=knn_model.score(x_test,y_test)
 print("score:",score)
 y_predict =knn_model.predict(x_test)
 print(y_predict ==y_test)

运行结果
python:机器学习(KNN模型训练)(二)_第5张图片
没有唯一解
每次的分布不一样,可能当模型评分为1.0,预测结果也可能出现错误
原因:验证的种类较少导致验证不出对应结果
即使做了数据打乱也会出现数据的分布不均匀,测试集只有20%可能有结果未在内

举例:
有0,1,2,3,4这5种结果共20个数据,
假设打乱后测试集(20%):3,0,1,4
只验证了0,1,3,4不能代表全部

方法2:交叉验证
多次的取测试集进行验证
可以避免因数据分布的不均匀导致有些结果验证不出
不使用score使用cross_val_score,分10组求评分取均值

knn_model = KNeighborsClassifier(n_neighbors=2,p=3,weights='uniform')
knn_model.fit(x_train,y_train)
# score=knn_model.score(x_test,y_test)
# print("score:",score)
print(cross_val_score(knn_model,x_train,y_train,cv=10,scoring='accuracy').mean())
y_predict =knn_model.predict(x_test)
print(y_predict ==y_test)

运行结果
python:机器学习(KNN模型训练)(二)_第6张图片
评分不是1.0
因为每个测试集内数据分布的不均匀

KNN原理:
从训练集中找到与新数据最近的K条记录,根据这些记录的分类决定新数据的分类
主要因素:K的大小,训练数据集的大小、距离
距离计算:欧式距离
找邻居:最近的K个训练对象
分类:根据记录分类

模型训练模型(鸢尾花记录):
1、数据获取
2、数据处理: 特征数据、标签数据、DataFrame合并、数据清洗、index排序、数据格式转换DataFrame->Numpy 、维度转换
3、数据分割:训练集、测试集
4、算法选择:KNN分类
5、模型训练:训练集数据
6、模型评分:测试集数据(模型的准确度)
7、模型预测:测试集数据进行预测

超参调试:
1、K小于数据集数量的平方根
2、权重weights
3、p–欧式距离的次方数求和
4、交叉验证–测试数据+训练数据分割多块 取均值

KNN模型训练
joblib.dump(value=,filename=)
joblib.load(filename=)

你可能感兴趣的:(python,机器学习,python)