机器学习的步骤:
- 获取数据 --->数据预处理(缺失值、异常值)--->数据集的划分(训练集和测试集)--->特征工程(特征抽取、特征预处理、特征降维)--->模型训练(调用sklearn中的方法)--->模型评估(比对预测值和真实值、计算准确率等)
- 案例数据集下载:百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间
https://pan.baidu.com/s/1kq3PZtTaLFM9P_z-qtl4vw?pwd=i523
百度网盘:提取码:i523
一、K近邻算法:
基本定义:就近原则来确定类别,距离公式、K的取值:K值多小,容易受到异常值的影响、K值过大容易受到样本不均衡的影响,主要应用于数据量少的预测。
案例1:使用sklearn自带的数据集,对鸢尾花进行分类
# coding = utf-8
# 导入sklearn自带的数据集
from sklearn.datasets import load_iris
# 导入训练集测试集的划分器
from sklearn.model_selection import train_test_split
# 导入标准化库
from sklearn.preprocessing import StandardScaler
# 导入KNN算法预估器
from sklearn.neighbors import KNeighborsClassifier
# 导入网格搜索
from sklearn.model_selection import GridSearchCV
def iris_knn_cv():
"""
用KNN算法对iris进行分类,网格搜索和交叉验证
:return:
"""
# 获取数据集
iris = load_iris()
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6) # random_state随机种子
# 标准化
# 实例化转换器
transfer = StandardScaler()
# 调用转换器
# 训练集标准化
x_train = transfer.fit_transform(x_train)
# 测试集标准化
x_test = transfer.transform(x_test)
# KNN 算法预估器
# 实例化一个预估器类
estimator = KNeighborsClassifier(n_neighbors=6) # n_neighbors=6 相当于k=6
# 加入网格搜索和交叉验证
# 参数准备
params_dict = {'n_neighbors': [1, 3, 5, 7, 9, 11]}
estimator = GridSearchCV(estimator, param_grid=params_dict, cv=10)
estimator.fit(x_train, y_train)
# 模型训练
estimator.fit(x_train, y_train)
# 模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("计算准确率方法:\n", score)
print("最佳参数:", estimator.best_params_)
print("最佳结果:", estimator.best_score_)
print("最佳预估器:", estimator.best_estimator_)
print("交叉验证结果:", estimator.cv_results_)
return None
if __name__ == "__main__":
iris_knn_cv()
案例2:使用K近邻算法对face_boo用户签到预测
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
data = pd.read_csv("D:\\机器学习\\数据集\\fece_book\\train.csv")
# 缩小数据范围
data1 = data.query("x >2 & x <2.5 & y > 1.0 & y < 1.5")
# 处理时间戳,unit="s"表示指点时间为s
time_value = pd.to_datetime(data1["time"], unit="s")
date = pd.DatetimeIndex(time_value)
# 添加日期day
data1["day"] = date.day
# 添加星期
data1["week"] = date.week
# 添加小时
data1["hour"] = date.hour
# 过滤掉签到次数少的地点
place_count = data1["row_id"].groupby(by=data1["place_id"]).count()
# 过滤掉签到次数小于3
place_count = place_count[place_count > 3]
# 返回DataFrame
data1_final = data1[data1["place_id"].isin(place_count.index.values)]
# 筛选特征值和目标值
# 特征值
x = data1_final[["x", "y", "accuracy", "day", "week", "hour"]]
# 目标值
y = data1_final["place_id"]
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 特征工程
# 1、标准化
# 实例化转换器
transfer = StandardScaler()
# 调用转换器
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# KNN算法预估器
estimator = KNeighborsClassifier()
# 加入网格搜索与交叉验证
# 1、参数准备
params_dict = {"n_neighbors": [3, 5, 7, 9]}
# 网格搜索
estimator = GridSearchCV(estimator, param_grid=params_dict, cv=3)
estimator.fit(x_train, y_train)
# 模型评估
# 方法1:直接比较真实值与预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比较真实值与预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
# 最佳参数
print("最佳参数:", estimator.best_params_)
# 最佳结果
print("最佳结果:", estimator.best_score_)
# 最佳预估器
print("最佳预估器:", estimator.best_estimator_)
# 交叉验证结果
print("交叉验证结果:", estimator.cv_results_)
二、朴素贝叶斯算法:
1、朴素:假设特征与特征之间相互独立 2、贝叶斯:贝叶斯公式 3、拉普拉斯平滑系数 4、优点:对缺失数据不敏感,计算快 5、缺点:概率值与样本之间的关系 6、应用场景:文本分类
案例3:用朴素贝叶斯对新闻文本分类、sklearn自带的数据集
# coding = utf-8
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
# 文本特征抽取
from sklearn.feature_extraction.text import TfidfVectorizer
# 贝叶斯转换器
from sklearn.naive_bayes import MultinomialNB
def nb_new():
"""
使用朴素贝叶斯算法对文本分类
:return:
"""
# 获取数据集,默认是训练集,改成all表示全部下载
data = fetch_20newsgroups(subset="all")
# 数据集的划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target)
# 特征工程,文本特征抽取
# 实例化转换器
transfer = TfidfVectorizer()
# 调用转换器
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 贝叶斯算法预估器
estimator = MultinomialNB()
# 模型训练
estimator.fit(x_train, y_train)
# 模型评估
# 方法1:直接比对真实值与预测值
y_predict = estimator.predict(x_test)
print("y_predict", y_predict)
print("直接比对真实值与预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("计算准确率:", score)
print("x_train", x_train)
return None
nb_new()
三、决策树
1、决策:找到最高效的决策顺序 -- 信息增益,信息增益:信息熵 - 条件熵
2、优点:能够可视化、可解释能力强
3、缺点:容易过拟合
案例4:决策树对泰坦尼克乘客生存预测
import pandas as pd
# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer
# 数据集划分
from sklearn.model_selection import train_test_split
# 决策数预估器
from sklearn.tree import DecisionTreeClassifier, export_graphviz
titanic = pd.read_csv('./titanic/train.csv')
# 赛选特征值和目标值的选择
# 1、特征值
x = titanic[["Pclass", "Sex", "Age"]]
y = titanic[["Survived"]]
# 缺失值的处理, 2 Age 714 non-null float64
# 年龄段有缺失值,使用平均值填充
x.loc[:, "Age"].fillna(x["Age"].mean(), inplace=True)
# 转换成字典,orient="records"表示转换的格式
x = x.to_dict(orient="records")
# 数据集的划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22) # random_state=22 随机种子
# 实例化字典转换器
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 实例化预估器
estimator = DecisionTreeClassifier(criterion="entropy") # criterion="entropy"计算信息增益
# 模型训练
estimator.fit(x_train, y_train)
# 模型评估
# 计算准确率
score = estimator.score(x_test, y_test)
print("计算准确率:", score)
# 决策树可视化
export_graphviz(estimator, out_file="./决策树可视化泰坦尼克.dot", feature_names=transfer.get_feature_names())
四、随机森林:
1、随机: 训练集随机 特征随机:降维,降低模型复杂度 2、森林:多个决策树 3、应用场景:高维度特征,大数据
案例5:随机森林泰坦尼克乘客生存预测
import pandas as pd
from sklearn.model_selection import train_test_split
# 网格搜索
from sklearn.model_selection import GridSearchCV
# 集成方法中的随机森林
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
data = pd.read_csv('titanic/train.csv')
# 特征值和目标值的筛选
# 1、特征值
x = data[["Pclass", "Sex", "Age"]]
y = data[["Survived"]]
# 年龄缺失值的填充,平均值填充
x.loc[:, "Age"].fillna(x["Age"].mean(), inplace=True)
# 特征抽取 转换成字典,orient="records"表示转换的格式
x = x.to_dict(orient="records")
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22) # random_state=22 随机种子
# 实例化字典转换器
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 随机森林
estimator = RandomForestClassifier()
# 加入网格搜索和交叉验证
param_dict = {"n_estimators": [120, 240, 330, 500, 800, 1200], "max_depth": [5, 7, 9, 13, 24, 36]}
# 交叉验证和网格搜索
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 模型评估
# 计算准确率
score = estimator.score(x_test, y_test)
print("准确率:", score)
# 最佳参数
print("最佳参数:", estimator.best_params_)
print("最佳结果:", estimator.best_score_)
print("最佳预估器:", estimator.best_estimator_)
print("交叉验证结果:", estimator.cv_results_)
五、总结
分类算法:1、K近邻算法:适用于数据量小的分类
2、朴素贝叶斯:适用于文本分类,特征与特征之间要相互独立
3、决策树:适用于需要可视化的流程
4、随机森林:适用于高维度特征、大数据场景。