1. 数据集
- 训练数据:用于训练,构建模型;
- 测试数据:在模型检验时使用,用于评估模型是否有效。
#sklearn中的数据集API介绍
#sklearn.datasets
#获取小规模数据集,数据包含在datasets中
datasets.load_*()
获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
datasets.fetch_*(data_home=None)
#上述返回的数据类型是datasets.base.Bunch(字典格式)
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(li.data) #获取特征值
print('**'*100)
print(li.target) #获取目标值
print(li.DESCR)
print(li.feature_names)
print(li.target_names)
1.1 数据集的分割
from sklearn.datasets import load_iris
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)
用于分类的大数据集
from sklearn.datasets import load_iris,fetch_20newsgroups
from sklearn.model_selection import train_test_split
news = fetch_20newsgroups(subset='all')
print(news.data)
print(news.target)
1.2 转换器与估计器
- fit_transform():输入数据直接转换;
- fit_transform=fit()(输入数据,无其他操作)+transform()(进行数据的转换)。
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
#原数据的平均值和标准差转换原数据
data = s.fit_transform([[1,2,3],[4,5,6]])
#依据每一列的平均值和标准差
data1 = s.fit([[1,2,3],[4,5,6],[7,8,9]])
#以上述的平均值和标准差进行转换,进行归一化处理
data1 = s.transform([[2,2,3],[7,5,6]])
print(data1)
print(data)
估计器:在sklearn中,估计器(estimator)是一个重要的角色,分类器和回归器都属于estimator,是一类实现了算法的API。
首先输入训练数据,然后预测测试数据,然后显示准确率。
估计器工作流程(图源黑马程序员)
- 用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
- 用于回归的估计器:
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
2. KNN算法
定义:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数的大多数属于某一个类别,则该样本也属于这个类别。
注:需要做标准化处理,K的取值很重要。
两个样本之间的距离采用欧式距离进行计算,若即
实例处理:
- 特征值:x,y坐标,定位准确性,时间;
- 目标值:入住位置id
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.preprocessing import StandardScaler
#K近邻算法预测用户签到位置
def knncls():
#读取数据
data = pd.read_csv("train.cav")
print(data.head(10))
#数据处理,
# 1. 缩小数据,query()可进行数据的查询筛选
data = data.query("x>1.0 & x<1.25 & y>2.5 &y<2.75")
# 2. 处理时间
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'] = time_value.weekday
#删除时间特征
data.drop(['time'],axis = 1) #sklearn中列为0,pandas中列为1
#把签到数量少于n个的目标位置删除
place_count = data.groupby('place_id').count()
#reset_index()是还原索引,从新变为默认的整型索引,这里是指将place_id重新变为特征
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)
#输入数据
knn.fit(x_train,y_train)
#训练数据
#预测测试集
y_predict = knn.predict(x_test)
#得到准确率
result = knn.score(y_test,y_predict)
print('预测的准确率',result)
return None
if __name__ =='__main__':
knncls()
KNN总结:
- 优点:简单,易于理解,易于实现,无需估计参数,无需训练;
- 缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大;必须指定K值,K值选择不当则分类精度不能保证。
- 小数据场景,几千~几万样本,具体场景具体业务去测试。
。。。。。。
网友评论