本文介绍了机器学习入门算法-k将使用近邻算法demo演示机器学习分类算法。
在首先介绍算法时,首先回顾分类和回归之间的区别。文章分类识别也是如此,如1代表体育,2代表技术,3代表娱乐属于分类问题,需要使用分类算法。预测票房、股票等具体价值,这是连续的,属于回归问题,需要使用回归算法。在机器学习中添加两个重要的概念:转换器和估计器。
转换器和估计器
转化器

转换器示意图
从代码层面来说,它是继承的Transformer这类是转化器。
实例演示
api 介绍fit_transform():输入数据直接转换fit(): 输入数据,计算平均值、方差等,但不做数据transform(): 转换数据
fit_transform()执行两个步骤,fit和transform,fit指定转化标准,transform跟fit转化制定的标准。 out【3】和out【6】执行结果一致,但与out【8】不一致,因为它的fit标准变了。
类图关系
StandardScaler继承了TransformerMixin,实例化出来的被称为转换器。
估计器
sklearn实现机器学习算法-估计器
在sklearn中,估计器(estimator)分类器和回归器都是重要的角色estimator,是实现算法的一类API
1.用于分类的估计器:sklearn.neighborsk-近邻算法?sklearn.naive_bayes 贝叶斯?sklearn.linear_model.LogisticRegression 逻辑回归2.用于回归的估计器:sklearn.linear_model.LinearRegression 线性回归?sklearn.linear_model.Ridge 岭回归
估计器的使用过程
分类算法-k近邻算法
概念
算法概念示例图
图中有一个人不知道自己属于哪个区域,但他知道别人在哪里和距离。用最近的人所在的区域来表示你所在的区域。这是法的核心思想。
定义:如果样本在特征空间中,样本也属于这一类。KNN算法最早是由Cover和Hart一种分类算法。
概念案例示意图
这里的特点是打斗镜头和接吻镜头,目标值是爱情片还是动作片。然后用k近邻算法找出它的距离未知电影。
两个样本之间的距离可以通过以下公式计算,也称为欧式距离。
算法公式
但如果它的特点很大,它会影响数据的准确性。。
k-近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute计算最近邻居的算法可以选择}ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto将尝试根据传递给fit决定最合适算法的方法值。 (影响效率的实现方式不同)
实例
原题目网站:https://www.kaggle.com/c/facebook-v-predicting-check-ins
根据提供的信息预测用户的位置
问题描述
实例数据 https://pan.baidu.com/s/1BGKkCagNT8q81M-xgyW64w
密码 b2n4
数据描述
from sklearn.datasets import load_iris, fetch_20newsgroups, load_bostonfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.preprocessing import StandardScalerfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.metrics import classification_reportfrom sklearn.feature_extraction import DictVectorizerfrom sklearn.tree import DecisionTreeClassifier, export_graphvizfrom sklearn.ensemble import RandomForestClassifierimport pandas as pddef knncls(): """ K-近邻预测用户签到位置 :return:None """ # 读取数据 data = pd.read_csv("./data/FBlocation/train.csv") # print(data.head(10)) # 处理数据 # 1.缩小数据,查询数据晒讯 data = data.query ("x > 2.0 & x < 2.25 & y > 2.5 & y < 2.75") # 处理时间数据 time_value = pd.to_datetime(data['time'], unit='s') print(time_value) # 将日期格式转换为 字典格式 time_value = pd.DatetimeIndex(time_value) # 构造一些特征 data['day'] = time_value.day data['hour'] = time_value.hour data['weekday'] = time_value.weekday # 删除时间戳特征 data = data.drop(['time'], axis=1) # 删除少于n个目标位置的签到 place_count = data.groupby('place_id').count() tf = place_count[place_count.row_id > 3].reset_index() data = data[data['place_id'].isin(tf.place_id)] # 取出数据中的特征值和目标值 y = data['place_id'] x = data.drop(['place_id'], axis=1) # 数据分割训练集合测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 特色工程(标准化) std = StandardScaler() # 标准化测试集和训练集的特征值 x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 算法过程 # 超参数 knn = KNeighborsClassifier(n_neighbors=5) # fit, predict,score knn.fit(x_train, y_train) # 得出预测结果 y_predict = knn.predict(x_test) print("预测的标签到位为:", y_predict) # 得出准确率 print("预测的准确率:", knn.score(x_test, y_test))
提高准确率
没有变标准
标准化之后
去除无用的rowid
调整n_neighbors=6
实例流程:
1、数据集的处理
2、分割数据集
3、对数据集进行标准化
4、estimator流程进行分类预测
注意点
1.k值取多大?有什么影响?
k值取很小:容易受异常点影响;k值取很大:容易受最近数据太多导致比例变化。
2.性能问题
每个样本进行预测都要与所有样本计算欧式距离,导致它的性能非常低下。在我们选择算法的时候,通常要考虑准确率高和不影响机器性能的算法。所以这个算法在实际较少用到。
3.优点
简单,易于理解,易于实现,。估计参数不是KNeighborsClassifier(n_neighbors=5) 里的n_neighbors的参数,这种的参数叫做超参数,而估计参数是算法里面的参数。无需训练,因为与每个样本的距离的都是固定的,所以无需训练。
4.缺点
懒惰算法,对测试样本分类时的计算量大,内存开销大;必须指定K值,K值选择不当则分类精度不能保证。