目录
from sklearn.externals import joblib
机器学习算法分类
- 监督学习(预测) (特征值+目标值)
分类(目标值离散型):k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
回归(目标值连续型):线性回归、岭回归
标注:隐马尔可夫模型(不做要求)
- 无监督学习 (特征值)
聚类:k-means
1、sklearn数据集
1、数据集划分
机器学习一般的数据集,划分为训练集和测试集。
训练集:用于训练,构建模型
测试集:在模型检验时使用,用于评估模型是否有效
2、sklearn数据集接口介绍
- sklearn数据集划分API:
sklearn.model_selection.train_test_split
- sklearn.datasets 加载获取流行数据集
sklearn.datasets.load_*() 获取小规模数据集,数据包含在datasets里
sklearn.datasets.fetch_*(data_home=None) 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/
标签名指的是目标值
3、sklearn分类数据集
- 数据集分割
例子:
- 用于分类的大数据集
这是一个新闻数据集
获取新闻数据集的例子:
4、sklearn回归数据集(目标值是连续的)
例子:
转换器和估计器
转换器
转换器是在特征工程时用,fit_transform就相当于fit+transform。
fit只把数据输入进去,做一些平均,方差计算,transform只用fit进去的标准来转换数据进行输出。
估计器
估计器是实现了算法的API
分类模型的评估
estimator.score()
一般的估计器都有score方法(算准确率),即预测结果正确的百分比。(预测100个对象,有多少个预测正确)
精确率、召回率
F1-score
精确率和召回率
我们先考虑二分类的问题,比如对猫和狗进行分类的时候,会出现预测结果正确和错误的。
更多的场景是考虑召回率,比如预测癌症的场景中,分析100个癌症患者中被预测为癌症的概率。
其他分类标准
F1-score,反应了模型的稳健性。F1是综合评判标准。
分类模型评估API
sklearn.metrics.classification_report
模型的选择与调优
1、交叉验证
目的:为了让被评估的模型更加准确可信
2、网格搜索
超参数搜索 - 网格搜索API
一般交叉验证和网格搜索一起使用
sklearn.model_selection.GridSearchCV
GridSearch:网格搜索
CV:cross validation 交叉验证
cv一般填10
案例
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris, fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
import pandas as pd
def knncls_GridSearchCV():
"""
K-近邻预测用户签到位置
:return: None
"""
# TODO 读取数据
data = pd.read_csv("train.csv")
# print(data.head(10))
# TODO 处理数据
# 1、缩小数据量,为了迅速查询数据
data = data.query("x>1.0 & x<1.25 & y>2.5 & y<2.75")
# print(data.head(10))
# 把日期格式转换成字典格式
time_value = pd.to_datetime(data['time'], unit='s')
# print(time_value)
# print(type(time_value)) # Series
time_value = pd.DatetimeIndex(time_value)
# print(time_value)
# print(type(time_value)) # DatetimeIndex
# 2、构造一些时间特征
data['day'] = time_value.day # 这种形式的增加列,是把time_value的day复制一份,而loc方法是直接拿来用。
data['hour'] = time_value.hour
data['weekday'] = time_value.weekday
# 3、把时间戳特征删除
data = data.drop(['time'], axis=1) # Pandas中axis=1表示列
# print(data)
# 4、将签到位置少于n个用户的删除
place_count = data.groupby('place_id').count() # 分组之后,索引为分组字段,并且列没有分组字段
tf = place_count[place_count.row_id > 3].reset_index() # 重设索引,并且列增加索引字段
data = data[data['place_id'].isin(tf.place_id)]
# 把row_id列删除,此列无意义
data = data.drop(['row_id'], axis=1)
# print(data)
# 5、取出数据当中的特征值和目标值
y = data['place_id']
x = data.drop(['place_id'], axis=1)
# 6、进行数据的分割,训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 训练目标值,测试目标值,训练特征值,测试特征值
# print(x_train)
# print(x_test)
# TODO 特征工程(标准化)
std = StandardScaler()
# 对测试集和训练集的特征值进行标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
'''
# TODO 进行算法流程
knn = KNeighborsClassifier(n_neighbors=3)
# fit predict,score
knn.fit(x_train, y_train)
# TODO 得出预测结果
y_predict = knn.predict(x_test)
print("y预测的目标签到位置为:", y_predict)
# TODO 得出准确率
print("预测的准确率:", knn.score(x_test, y_test))
'''
knn = KNeighborsClassifier()
# 构造一些参数的值进行搜索
param = {"n_neighbors": [3, 5, 10]}
# TODO 进行网格搜索
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)
# 预测准确性
print("在测试集上的准确率:", gc.score(x_test, y_test))
print("在交叉验证当中最好的结果:", gc.best_score_)
print("选择最好的模型是:", gc.best_estimator_)
print("每个超参数每次交叉验证的结果:", gc.cv_results_)
return None
if __name__ == '__main__':
knncls_GridSearchCV()
结果: