机器学习算法基础——数据集操作、K-近邻算法
sklearn数据集
数据集基本操作
1.数据集划分
机器学习一般的数据集会划分为两个部分:
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
一般训练集和测试集比例是75%:25%
2.scikit-learn数据集API介绍
类:sklearn.datasets
sklearn.datasets
加载获取流行数据集
●datasets.load_()
获取小规模数据集,数据包含在datasets里
●datasets.fetch_(data_home=None)
获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认~/scikit_learn_data/
【获取数据集返回的类型】
load* 和 fetch*返回的数据类型datasets.base.Bunch(字典格式)
data:特征数据数组,是 [n_samples * n_features] 的二维numpy.ndarray 数组
target:标签数组,是 n_samples 的一维numpy.ndarray 数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名,回归数据集没有
【获取数据】
sklearn.datasets.load_iris()——加载并返回鸢尾花数据集
sklearn.datasets.load_digits()——加载并返回数字数据集
【Sklearn 分类数据集——鸢尾花数据集】
from sklearn.datasets import load_iris
li = load_iris()
print('获取特征值')
print(li.data)
print('获取目标值')
print(li.target)
**********************************************
获取特征值
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
....]
获取目标值
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...]
3.数据集分割
sklearn.model_selection.train_test_split(*arrays, **options)
x 数据集的 特征值
y 数据集的 标签值
test_size 测试集的大小,一般为float、0.25
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 训练集特征值,测试集特征值,训练标签,测试标签(默认随机取)
【数据集的分割】
from sklearn.model_selection import train_test_split
li = load_iris()
#注意返回值、训练集:train,x_train特征值,y_train目标值,测试集:test,x_test,y_test
x_train,x_test,y_train,y_test = train_test_split(li.data,li.target,test_size=0.25)
print('训练集特征值和目标值:',x_train,y_train)
print('测试集特征值和目标值:',x_test,y_test)
【用于分类的大数据集】
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) #新闻数据集
●subset: ‘train’或者’test’,‘all’,可选,选择要加载的数据集,训练集的“训练”,测试集的“测试”,两者的“全部”
●datasets.clear_data_home(data_home=None)
清除目录下的数据
【用于分类的大数据集——新闻数据集】
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newgroups(subset='all')
print(news.data)
print(news.target)
【Sklearn 回归数据集——波士顿房价数据集】
from sklearn.datasets import load_boston
lb = load_boston()
print('获取特征值')
print(lb.data)
print('目标值')
print(lb.target)
转换器与估计器
1.转换器
fit_transform() 输入数据直接转换
fit() 输入数据,计算平均值、方差等
transform() 进行数据的转换,使用的是上面 fit() 计算出的均值、方差
fit_transform()=fit()+transform().
数据转换最好一次性完成
(1)实例化 (实例化的是一个转换器类(Transformer))
(2)调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
2.估计器
在sklearn中,估计器(estimator)是一个重要的角色,分类器和回归器都属于estimator,是一类实现了算法的API。
(1)用于分类的估计器:
●sklearn.neighbors k-近邻算法
●sklearn.naive_bayes 贝叶斯
●sklearn.linear_model.LogisticRegress 逻辑回归
(2)用于回归的估计器:
●sklearn.linear_model.LinearRegression 线性回归
●sklearn.linear_model.Ridge 岭回归
【估计器的工作流程】
分类算法-k近邻算法(KNN)
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法。
【sklearn 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方法的值来决定最合适的算法。 (不同实现方式影响效率)
【案例实现】
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def knncls():
#导入数据
data = pd.read_csv('data.csv')
#处理数据,缩小数据集
data = data.query('x>1.0 & x<1.25 & y>2.5 & y<2.75')
#处理时间的数据
time_value = pd.to_datetime(data['time'],unit='s')
#把日期格式转换成字典格式,以便获取年、月、日特征
time_value = pd.DatetimeIndex(time_value)
#构造一些特征
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = tiem_value.weekday
#把时间戳特征删除
data = data.drop(['time'],axis=1) #sklearn删除列,axis=1
##将签到位置少于n个目标位置的删除
#统计次数,此时以 place_id 为索引,row_id 里是出现的次数
place_count =data.groupby('place_id').count()
#大于3的保留下来, place_id 转换为列,还原索引
tf = place_count[place_count.row_id > 3].reset_index()
#保留下所有大于3的数据
data = data[data['place_id'].isin(tf.place_id)]
#取出数据中的特征值和目标值
y = data['place_id']
x = data.drop(['palce_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)
#直接调用 transform 就可以
x_test = std.transform(x_test)
#进行算法流程
knn = KNeighborsClassifier(n_neighbors=5)
#fit(输入数据),estimate(预测数据目标值),score(得出准确率)
knn.fit(x_train,y_train)
#得出预测结果
y_predict = knn.predict(x_test)
print('预测的目标签到位置为:',y_predict)
#得出准确率
print('预测的准确率:',knn.score(x_test,y_test))
return None
if __name__ == '__main__':
knncls()
(1)K—近邻算法问题:
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化
(2)K—近邻算法优缺点:
优点:简单,易于理解,易于实现,无需估计参数,无需训练。
缺点:
①懒惰算法,对测试样本分类时的计算量大,内存开销大。
②必须指定K值,K值选择不当则分类精度不能保证。
(3)使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试。