数据集划分
机器学习一般的数据集会划分为两个部分:
**训练数据:**用于训练,构建模型
**测试数据:**在模型检验时使用,用于评估模型是否有效
API
sklearn.model_selection.train_test_split
sklearn数据集API介绍
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分类数据集举例
sklearn.datasets.load_iris() :加载并返回鸢尾花数据集
(这是自带的一个函数,包括了数据集)
from sklearn.datasets import load_iris
li = load_iris() #实例化API
print("获取特征值")
print(li.data)
print("目标值")
print(li.target)
print(li.DESCR)
这个数据集共有150组,每行是一组数据,一组里有四个值(四列),每一个值代表相应的特征,目标值分为0,1,2(比如0,1,2分别代表鸢尾花中的三个不同类型)
Attribute Information : 四个特征的属性含义
数据集分割
sklearn.model_selection.train_test_split(*arrays, **options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小(一般可以选20%-30%),一般为float
random_state 随机数种子,不同的种子会造成不同的随机 采样结果。相同的种子采样结果相同。
return 训练集特征值,测试集特征值,训练标签,测试标签 (默认随机取)
数据集分割举例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
li = load_iris() #实例化API
#print("获取特征值")
#print(li.data)
#print("目标值")
#print(li.target)
#print(li.DESCR)
# 注意返回值, 训练集train:x_train, y_train;测试集test:x_test,y_test。train_test_spli()的返回值严格按照特征值、目标值顺序来,所以是x_train, x_test, y_train, y_test;traintest_spli()默认是乱序的
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)
此处省略了大量特征值
此处省略了大量特征值
即这个函数把数据集按照3:1的比例分成了训练集(特征值和目标值)和测试集(特征值和目标值),并且是乱序的
用于分类的大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) subset: ‘train’或者’test’,‘all’,可选,选择要加载的数据集. 训练集的“训练”,测试集的“测试”,两者的“全部”
datasets.clear_data_home(data_home=None) 清除目录下的数据
sklearn 回归数据集举例
from sklearn.datasets import load_boston
lb = load_boston()
print("获取特征值")
print(lb.data)
print("目标值")
print(lb.target)
print(lb.DESCR)
回归数据集特征:目标值是连续型数据
转换器与预估器
转换器:
fit_transform() 和fit()、transform()效果是一样的
但是,fit()是通过计算对应列的方差、平均值等来确定转换的方式,然后再用transform()进行转化,所以fit([1,2,3],[4,5,6]),再transform([2,3,4],[5,6,7])的时候,应用的标准是fit([1,2,3],[4,5,6])的标准。
一般直接fit_transform() 即可
估计器:
K-近邻算法
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
这个未知电影名称的类别可以通过计算“距离”来获得
距离公式如下,举个例子:根号((18-3)^ 2+(90-104)^ 2)=20.5
相似的样本特征之间的值都是相近的
对数据要先进行标准化处理,不然有很大的数据的话,其他数据的影响就被忽略了
sklearn k-近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
n_neighbors:int,可选(默认= 5,就是k值),k_neighbors查询默认使用的邻居数
(k值对结果会有影响)
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
例子
-
由于数据量大,节省时间 缩小x,y
-
时间戳进行(年,月,日,周,时分秒),当做新的特征
-
几千~几万,少于指定签到人数的位置删除
from sklearn.neighbors import kNeighborsClassifier
import pandas as pd
def knncls():
"""
k近邻预测用户签到位置
"""
# 读取数据
data = pd.read_csv("./data/------")
print(data.head(10)) #打印前十行
#输出 见图1
#处理数据
#1.缩小数据,查询数据筛选
data.query("x>1.0 & x<1.25 & y > 2.5 & y < 2.75")
#2.处理时间数据(转换成年月日周时分秒)
time_value = pd.to_datatime(data['time'],unit='s')
print(time_value)
#输出 见图2
#把日期格式转换为 字典格式
time_value = pd.DatatimeIndex(time_value)
#构造一些特征
data['day'] = time_value.day
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
#把时间戳特征删除
data = data.drop(['time'],axis=1) #pd里1表示列
print(data)
#输出 见图3
#把签到数量少于n个目标位置删除
place_count = data.groupby('place_id').count() #以place_id分组,统计次数;place_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))
#输出 见图4
if __name__ == "__main__":
knncls()
图1
图2
图3
图4
总结(KNN优缺点)
缺点: k值取很小的时候,容易受异常点影响;k值取很大的时候,容易受 K值数量波动;性能上,时间复杂度很高。懒惰算法,对测试样本分类时的计算量大,内存开销大 必须指定K值,K值选择不当则分类精度不能保证
优点: 简单,易于理解,易于实现,无需估计参数(是指算法里面的参数,比如求距离的时候),无需训练(不需要迭代,距离一次就算完了)
**使用场景:**小数据场景,几千~几万样本,具体场景去测试