机器学习算法分类
监督学习(预测):可以有输入数据中学到或建立一个模型,并以此模型推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
分类:K-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
回归:线性回归、岭回归
标注:隐马尔可夫模型
无监督学习:可以有输入数据中学到或建立一个模型,并以此模型推测新的结果。输入数据是有输入特征值所组成。
聚类:k-means
分类算法--K-近邻算法(KNN)
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法。
K值的大小有什么影响:1、K值取很小,容易受异常数据的影响;2、K值取很大,容易受样本数量的不平衡影响
性能问题:距离计算上面,时间复杂度高
使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
优点:简单,易于理解,易于实现,无需估计参数,无需训练
缺点:懒惰算法,对测试样本分类时的计算量大,内存消耗大;必须指定K值,K值选择不当则分类精确度不能保证
sklearn K-近邻算法API:sklearn.neighbors.KNeighborsClassifier
模型的选择与调优
交叉验证
交叉验证是为了让被评估的模型更加准确可信
交叉验证过程:将拿到的训练数据,分为训练和验证集。以下图为例,将数据分成5份,其中一份作为验证集。经过5次(组)测试,每次都更换不同的验证集,得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证结果。
超参数搜索--网格搜索
通常情况下,有很多参数都是需要手动指定的(如K-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预测几种超参数组合。每组超参数都采用交叉验证来进行评估,最后选择最优参数组合建立模型。
sklearn超参数搜索--网格搜索API:sklearn.model_selection.GridSearchCV
数据资源链接:https://pan.baidu.com/s/18pgecHglwITFz98DQeVo1A 密码:8sqk
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def kneighborsClassifier():
"""
K-近邻算法预测用户入住位置
:return: None
"""
"""pandas"""
# 读取数据
data = pd.read_csv("./FBlocation/train.csv")
# 缩小数据集,节约运算时间,正式运行可以不用缩小数据集
data = data.query("x<1.25 & x>1.0 & y>2.5 & y<2.75")
# print(data.head(10))
# 处理时间戳特征数据,单独构造一些特征
time_value = pd.to_datetime(data["time"])
# print(time_value)
# 构造一些新的特征 首先转换成字典格式,然后填充特征
time_value = pd.DatetimeIndex(time_value)
data["day"] = time_value.day
data["weekday"] = time_value.weekday
data["hour"] = time_value.hour
# print(data.head(10))
# 删除时间特征
data = data.drop("time", axis=1)
# print(data.head(10))
# 筛选入住位置 人数少于n个人的不要
place_count = data.groupby("place_id").count()
# 重新设置索引,把place_id这个列索引单独当作一列
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data["place_id"].isin(tf.place_id)]
# print(data)
y = data["place_id"]
x = data.drop("place_id", axis=1)
"""sklearn"""
# 分割数据集到训练集和测试集
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)
# 使用etimators去进行训练估计
# knn = KNeighborsClassifier(n_neighbors=5)
# # 输入数据
# knn.fit(x_train, y_train)
# # 预测测试集的样本的类别,和准确率
# y_predict = knn.predict(x_test)
# print("K-紧邻算法预测测试集这些样本入住位置:", y_predict)
# print("预测的准确率:", knn.score(x_test, y_test))
"""网格搜索调参数"""
knn = KNeighborsClassifier()
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=3)
# 在这个fit操作,已经进行过了3折交叉验证
gc.fit(x_train, y_train)
print("准确率:", gc.score(x_test, y_test))
# 打印交叉验证结果
print("在交叉验证中最好的验证结果:", gc.best_score_)
print("选择最好的K值为:", gc.best_estimator_)
print("每次交叉验证的结果:", gc.cv_results_)
if __name__ == "__main__":
kneighborsClassifier()