内容
转换器与预估器
KNN算法
模型选择与调优
朴素贝叶斯算法
决策树与随机森林
转换器与预估器
特征工程流程
1.实例化一个转换器类(transformer)
2.调用transformer.fit_transform()方法
fit():计算,transform():利用fir()计算的结果进行后续转化
预估器是一类实现了算法的API。
将预处理好的数据交给预估器,就可以训练出模型
分类
1.用于分类的预估器
sllwarn.neighbors:K-近邻算法
sklwarn.naive_baves:朴素贝叶斯算法
sklwarn.linear_model.LogisticRegression:逻辑回归
sklearn.tree:决策树与随机森林
2.用于回归的预估器
sklearn.linear_model.linearRegression:线性回归
sklearn.linear_model.Ridge:岭回归
3.用于聚类的预估器
sklearn.cluster.KMeans:Kmeans算法
预估器使用流程
1.实例化一个预估器estimator
2.训练:estimater.fit(x_train, y_train)
3.模型评估:
1)比对真实值(y_test)和预测值(y_predict=estimator.predict(x_test)
2)直接计算准确率:estimator.score(x_test, y_test)
将训练集交给预估器,就可以训练出模型,然后评估模型
KNN算法
是一种判断类别(目标值是类别)的算法
根据我的邻居来判断我的类别
距离计算使用欧式距离计算公式
a(a1,b1,a3),b(b1,b2,b3)之间的距离:根号下((a1-b1)2+(a2-b2)2+(a3-b3)^2)
如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
K的值会影响到最终结果
API
sklearn.neighbors.KNeighBorsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors:int,可选(默认5),即K值,设置查询的邻居的个数
algorithm:可选的算法
示例:KNN算法对鸢尾花进行分类
流程
获取数据集
划分数据集
特征工程:标准化
KNN预估器流程
1)实例化预估器类
2)fit数据进行训练
评估模型效果
方法1:比对测试集的预测值和真实值
方法2:直接计算准确率
示例:
"""
用knn算法对鸢尾花进行分类
:return: None
"""
# 1.获取数据集
iris = load_iris()
# 2.划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3.特征工程,标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.knn预估器流程
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5.模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测的结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_test == y_predict)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
return None
总结
优点:简单,易于理解,易于实现
缺点:计算量大,事件复杂度高,内存开销大
适用场景:小数据场景,几千到几万
模型选择与调优
交叉验证
为了让被评估的模型更加准确可信
更好的利用训练集数据
将拿到的训练集数据,分为若干组(几组叫做几折)再次分为训练集和验证集,每一组的训练集训练后,用每一组的验证集进行验证,最后,取各组验证机的平均值表示模型的训练结果
超参数:需要手动设置的参数。如knn算法中的K值
网格搜索
可以自动对超参数进行交叉验证,最后选择最优参数集
API:sklwarn.model_selection.GridSearchCV(estimator, param_grid=Nnone,cv=None)
对估计器,自动对指定的超参数集进行享尽的搜索(网格搜索);对训练集数据进一步优化处理(交叉验证)
estimator:估计器对象
param_grid:估计器的K参数(dict){“n_neighbors”:[1,3,5]}
cv:指定几折交叉验证(分为几组)
然后使用fit函数训练数据
使用score查看训练的结果
对结果进行分析:
best_score_:在交叉验证中最好的结果
best_estimator_:最好的参数模型
cv_results_:每次交叉验证后的准确率结果
可对用KNN算法对鸢尾花进行分类的例子,加上网格搜索和交叉验证
"""
用knn算法对鸢尾花进行分类
:return: None
"""
# 1、获取数据集
iris = load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# x_test = transfer.fit_transform(x_test)
# 4、KNN预估器流程
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
return None
def knn_iris_gscv():
"""
用knn算法对鸢尾花进行分类,加入网格搜索和交叉验证
:return: None
"""
...
# 模型选择与调优
# 网格搜索和交叉验证
# 构造超参数的字典
param_dict = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 6、交叉验证和网格搜索的结果
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)
return None
朴素贝叶斯算法
假定特征之间相互独立的,利用贝叶斯公式的分类算法,如文章的分类
朴素:假定特征与特征之间相互独立
贝叶斯:贝叶斯公式
P(C|W)=P(W|C)*P(C)/P(W)
需要配合拉普拉斯平滑系数一起作用
API
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
朴素贝叶斯分类
alpha:拉普拉斯平滑系数
案例:对新闻进行分类
"""
用KNN算法预测Facebook签到位置
:return: None
"""
# 1、获取数据集
facebook = pd.read_csv("./FBlocation/train.csv")
# 2、基本的数据处理,拿到特征值和目标值
# 1)缩小数据范围
facebook = facebook.query("x > 1.0 & x <1.25 & y > 2.0 & y < 2.25")
# 2)选取有用的时间特征
time_value = pd.to_datetime(facebook["time"], unit="s")
time_value = pd.DatetimeIndex(time_value)
facebook["day"] = time_value.day
facebook["hour"] = time_value.hour
facebook["weekday"] = time_value.weekday
# 3)去掉签到较少的地点
place_count = facebook.groupby("place_id").count()
place_count = place_count[place_count["row_id"] > 3]
facebook = facebook[facebook["place_id"].isin(place_count.index)]
# 4)拿到特征值x和目标值y
x = facebook[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook["place_id"]
# 3、数据集的划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
# 4、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5、KNN预估器流程
estimator = KNeighborsClassifier()
# 6、模型选择与调优
# 准备好超参数
param_dict = {"n_neighbors": [5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 7、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 6、交叉验证和网格搜索的结果
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)
return None
def nb_news():
"""
用朴素贝叶斯算法对新闻进行分类
:return: None
"""
# 1、获取数据集
news = fetch_20newsgroups(data_home="./news", subset="all")
# print("news数据集返回结果:\n", news)
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, random_state=6)
# 3、特征工程:文本特征抽取TF-IDF
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
# x_test一定要用transform
x_test = transfer.transform(x_test)
# x_test = transfer.fit_transform(x_test)
# 4、预估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5、模型评估
score = estimator.score(x_test, y_test)
print("新闻分类的准确率为:\n", score)
return None
总结
优点
对缺失数据不敏感
稳定,快
缺点:
因为使用了用本属性独立性的假设,所以不适用于关联性强的特征的情况
使用场景:
对文本的分类
决策树与随机森林
决策树
基于if-else语句,用最快的选择顺序逐渐确定分类结果
怎么判断先选择哪个,再选择哪个?–先选择信息增益最大的那个
信息增益:表示得知特征x的信息,而使得Y信息的不确定性减少的程度
API:sklearn.tree.DicisionTreeClassfier(criterion=’gini’,max_depth=None)
决策树分类器
criterion:默认是’gini‘基尼系数,也可以选择信息增益的熵’entropy‘
max_depth:数的深度大小
可视化决策树
决策树的决策流程,可以可视化
步骤:
1.将决策流程导出为dot格式
sklearn.tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
2.安装graphviz
Ubuntu:ubuntu:sudo apt-get install graphviz;Mac:brew install graphviz
3.运行命令
$ dot -Tpng tree.dot -o tree.png
示例:
"""
用决策树算法对鸢尾花进行分类
:return: None
"""
# 1、获取数据集
iris = load_iris()
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、决策树预估器流程
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=4)
estimator.fit(x_train, y_train)
# 4、模型评估
# 比对
y_predict = estimator.predict(x_test)
print("预测的结果:\n", y_predict)
print("预测结果和真实值的比对:\n", y_predict == y_test)
# 准确率
score = estimator.score(x_test, y_test)
print("准确率:\n", score)
# 5、可视化决策树
export_graphviz(estimator, out_file="tree.dot", feature_names=iris.feature_names)
return None
总结:
优点
只需要很少的数据准备,不需要标准化
树木可视化
缺点
容易过拟合,不稳定
使用场景
有很好的分析能力,在企业决策过程中应用较多
随机森林
包含多个决策树的分类器
输出的类别是由个别树输出的类别的众数而定
集成学习方法
集成学习通过建立几个模型组合的形式来解决单一预测问题
原理是生成多个分类器/模型,各自独立的学习和作出判断。
这些预测最后结合成单预测
因此集成学习预测的结果优于任何一个单分类作出的预测
随机
训练集随机
总共有N个样本,从这N个样本中,随机有放回的抽取m个样本作为单个决策树的训练集(bootstrap)
特征随机
总共N个特征,从这N个特征中随机的抽取m个特征作为单个训练集的特征集
为什么要随机
1.预测能力不好的树会相互抵消
2.随机的方式增强了树之间的不相关性
每一个决策树有相同数量的n个样本,增强了每棵决策树的分类能力
API:
sklearn.ensenble.RandomForestClassifier(n_estimators=10, criterrion='gini', max_depth=None), boostrap=True
随机森林分类器
n_estimator:森林里的树木数量
criteria:分割特征的测量方法
max_depth:数的最大深度
bootstrap:是否在构建树时放回抽样
示例:
"""
用随机森林对泰坦尼克号乘客进行分类
:return:
"""
# 1.获取数据集
titanic = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2.基本数据处理
# 筛选出特征值、目标值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]
# 处理缺失值
x["age"].fillna(value=x["age"].mean(), inplace=True)
# 将特征值转换成字典类型
x = x.to_dict(orient="records")
# 3.划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
# 4.特征工程:字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5.预估器流程
estimator = RandomForestClassifier()
# 网格搜索与交叉验证
# 超参数准备
param_dict = {"n_estimators": [120,200,300,500,800,1200], "max_depth": [5,8,15,25,30]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 4、评估模型效果
# 方法a:比对预测结果和真实值
y_predict = estimator.predict(x_test)
print("比对预测结果和真实值:\n", y_predict == y_test)
# 方法b:直接计算准确率
score = estimator.score(x_test, y_test)
print("直接计算准确率:\n", score)
# 6、交叉验证和网格搜索的结果
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)
return None
总结:
优点
准确率高
适合大数据集
不需要降维
使用场景
大数据分类场景