经典算法
所谓“工欲善其事必先利其器”,要解决问题,就要有好的算法。
Scikit-Learn库中的几种经典机器学习算法:
一、K最近邻(KNN)
这个算法思路特别简单,就是随大流。对于需要贴标签的数据样本,他总是会找几个和自己离得最近的样本,也就是邻居,看看邻居是什么标签。如果他的邻居中的大多数样本都是某一类样本,他就认为自己也是这样一类样本。参数k,就是邻居的个数,通常是3,5,7,等不超过20的数字。
在机器学习算法中,常用的距离计算公式包括欧式距离和曼哈顿距离
所以,KNN算法的结果和K值的取值有关系,要注意的是,KNN要找的邻居都已经是“站好队的人”,也就是已经正确分类的对象。
下面进行实战:对心脏病数据的进行推断客户是否有心脏病:
1.导入数据:
import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
df_heart = pd.read_csv("heart.csv") # 读取文件
df_heart.head() # 显示前5行数据
2.查看患病个数:
import matplotlib.pyplot as plt
import seaborn as sns #导入seaborn画图工具箱
sns.countplot(x="target", data=df_heart, palette="bwr")
plt.show()
3.对某些特征转换为数值类型的哑变量:
a = pd.get_dummies(df_heart['cp'], prefix = "cp")
b = pd.get_dummies(df_heart['thal'], prefix = "thal")
c = pd.get_dummies(df_heart['slope'], prefix = "slope")
frames = [df_heart, a, b, c]
df_heart = pd.concat(frames, axis = 1)
df_heart.head()
df_heart = df_heart.drop(columns = ['cp', 'thal', 'slope'])
df_heart.head()
4.划分训练集和测试集:
# 构建特征和标签集
y = df_heart.target.values
X = df_heart.drop(['target'], axis = 1)
from sklearn.model_selection import train_test_split # 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2,random_state=0)
5.进行特征缩放:
# 进行特征缩放
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
6.模型训练:
from sklearn.neighbors import KNeighborsClassifier # 导入kNN算法
k = 5 # 设定初始K值为5
kNN = KNeighborsClassifier(n_neighbors = k) # kNN模型
kNN.fit(X_train, y_train) # 拟合kNN模型
y_pred = kNN.predict(X_test) # 预测心脏病结果
from sklearn.metrics import (accuracy_score, f1_score, average_precision_score, confusion_matrix) # 导入评估标准
print("{}NN 预测准确率: {:.2f}%".format(k, kNN.score(X_test, y_test)*100))
print("{}NN 预测F1分数: {:.2f}%".format(k, f1_score(y_test, y_pred)*100))
print('kNN 混淆矩阵:\n', confusion_matrix(y_pred, y_test))
7.寻找最佳K值
# 寻找最佳K值
f1_score_list = []
acc_score_list = []
for i in range(1