训练集:75%(推荐)、70%、80%。用于训练,构建模型
测试集:25%(推荐)、30%、20%。在模型检验时使用,用于评估模型是否有效
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:标签名,回归数据集没有
from sklearn.datasets import load_iris
li=load_iris()
print('获取特征值:{}'.format(li.data))
print('获取目标值:{}'.format(li.target))
print('描述:{}'.format(li.DESCR))
sklearn分类数据集
数据集进行分割
sklearn.model_selection.train_test_split(*arrays, **options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 训练集特征值,测试集特征值,训练标签,测试标签(默认随机取,顺序不可变)
from sklearn.model_selection import train_test_split
li=load_iris()
#print('获取特征值:{}'.format(li.data))
#print('获取目标值:{}'.format(li.target))
#print('描述:{}'.format(li.DESCR))
#注意返回值 训练集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_20newsgroups(subset='all') print(news.data) print(news.target)sklearn回归数据集
from sklearn.datasets import load_boston
lb=load_boston()
print('获取特征值:{}'.format(lb.data))
print('获取目标值:{}'.format(lb.target))
print('描述:{}'.format(lb.DESCR))
转换器与估计器
转换器
fit_transform():输入数据直接转换
fit():输入数据,但是不做事情(计算平均值、方差等等)+transform()进行数据的转换
In [1]: from sklearn.preprocessing import StandardScaler
In [2]: s=StandardScaler()
In [3]: s.fit_transform([[1,2,3],[4,5,6]])
Out[3]:
array([[-1., -1., -1.],
[ 1., 1., 1.]])
In [4]: ss=StandardScaler()
In [5]: ss.fit([[1,2,3],[4,5,6]])
Out[5]: StandardScaler()
In [6]: ss.transform([[1,2,3],[4,5,6]]) #以[[1,2,3],[4,5,6]]计算来的标准差和均值来转换的
Out[6]:
array([[-1., -1., -1.],
[ 1., 1., 1.]])
In [7]: ss.fit([[2,3,4],[4,5,7]])
Out[7]: StandardScaler()
In [8]: ss.transform([[1,2,3],[4,5,6]]) #[[2,3,4],[4,5,7]]计算来的标准差和均值来转换的
Out[8]:
array([[-2. , -2. , -1.66666667],
[ 1. , 1. , 0.33333333]])
估计器
在sklearn中,估计器(estimator)是一个重要的角色,分类器和回归器都属于estimator,是一类实现了算法的API。
1、用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
2、用于回归的估计器:
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
- 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
两个样本的距离可以通过如下公式计算,又叫欧式距离,比如说,a(a1,a2,a3),b(b1,b2,b3)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knncls():
'''
K—近邻预测用户签到位置
:return:None
'''
#读取数据
data=pd.read_csv('./data/FBlocation/train.csv')
#处理数据
#1.缩小数据,查询数据筛选
data.query('x>1.0 & x<1.25 & y>2.5 & y<2.75') #data.query()查询语句,data是DataFrame
#2.处理时间数据
time_value=pd.to_datetime(data['time'],unit='s')
#3.将日期函数转换为字典
time_value=pd.DatetimeIndex(time_value)
#3.构造一些特征
data['day']=time_value.day
data['hour']=time_value.hour
data['weekday']=time_value.weekday
#4.删除时间戳特征
data=data.drop(['time'],axis=1) #sklearn中0表示列,pandas在1表示列
#将签到数量少于n个目标位置删除
place_count = data.groupby('place_id').count()#按照place_id将数据分组,再求和,索引为place_count
tf = place_count[place_count.row_id > 3].reset_index()#reset_index()将place_count重新变为一列,索引就变为0,1,2……
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) #不需要fit,因为上面已经计算了均值和标准差
#进行算法流程
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))
if __name__=='__main__':
knncls()
- 总结
(1)k值大小
k值取很小:容易受异常点影响
k值取很大:容易受最近数据太多导致比例变化
(2)优缺点:
优点:简单,易于理解,易于实现,无需估计参数,无需训练
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大;必须指定K值,K值选择不当则分类精度不能保证。
使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试。
k-近邻算法实现:加快搜索速度——基于算法的改进KDTree,API接口里面有实现



