转换器与预估器 KNN算法 模型选择与调优 朴素贝叶斯算法 决策树与随机森林 转换器与预估器 特征工程流程转换器与预估器 KNN算法 模型选择与调优 朴素贝叶斯算法 决策树与随机森林 转换器与预...

内容
转换器与预估器
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

总结:

优点
准确率高
适合大数据集
不需要降维
使用场景
大数据分类场景

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容