【无标题】机器学习大概

1.学习knn算法的用法

2.参数调优

2.1 交叉验证

cross_val_score() 函数的用法
https://blog.csdn.net/weixin_42211626/article/details/100064842
选择较为平滑一段做参数

%%time

from sklearn import datasets 

# 测试集 - 数据原来测试算法
from sklearn.model_selection import train_test_split 

# 引入算法 - 近邻算法
from sklearn.neighbors import KNeighborsClassifier 

# 引入精度评估
from sklearn.metrics import accuracy_score 
from sklearn.model_selection import cross_val_score


import matplotlib.pyplot as plt 
import numpy  as np 
import pandas as pd

scores = []

data = datasets.load_iris()
data_X = data.data
data_y = data.target

for i in range(1,11):
    knn = KNeighborsClassifier(n_neighbors=i)
    score = cross_val_score(knn,data_X, data_y,cv = 15).mean()
    scores.append(score)

# print(scores)

# max_score = max(scores)
# max_score_time = scores.index(max_score)+1
# print("最高分:%.2f ,在第 %s 次" % (max_score,max_score_time)) 

plt.figure(figsize=[25,5])
plt.plot( range(1,11),scores)

2.2 网格交叉验证(最精准,算力用的最多)

GridSearchCV()
https://www.cnblogs.com/dalege/p/14175192.html

%%time
# 网格测试 解释 https://www.cnblogs.com/dalege/p/14175192.html

knn=KNeighborsClassifier()
# knn的参数范围,
params = {
    "n_neighbors":np.arange(1,11),
    "p":[1,2,3,4]
}
# cv是交叉验证次数,
grid = GridSearchCV(estimator=knn, param_grid=params, cv=10)
grid.fit(data_X, data_y)
print('最高分为: %.4f ,参数为: %s'%(grid.best_score_,grid.best_params_))

2.3随机搜索优化函数()

对网格交叉验证的随机采样,n_iter代表着迭代次数

%%time
# 随机搜索优化函数    https://zhuanlan.zhihu.com/p/56010146
knn = KNeighborsClassifier()
params = {
    "n_neighbors":np.arange(1,11),
    "p":[1,2,3,4]
}
rgrid = RandomizedSearchCV(estimator=knn, param_distributions=params,n_iter=10,random_state=1,cv=10)
rgrid.fit(data_X, data_y)
print('最高分为: %.4f ,参数为: %s'%(rgrid.best_score_,rgrid.best_params_))

二 分类树算法

#导入分类树算法
from sklearn.tree import DecisionTreeClassifier     
# 导入数据
from sklearn.datasets import load_wine     
# 导入训练模型
from sklearn.model_selection import train_test_split  
# 导入精度评估
from sklearn.metrics import accuracy_score


import pandas as pd 
import numpy  as np

# 导入数据
wine = load_wine()

# 拆分训练集
X_train , X_test , y_train , y_test = train_test_split(wine.data, wine.target , test_size=0.3,  random_state=1)
# tree = DecisionTreeClassifier()
tree = DecisionTreeClassifier(criterion='entropy')
model=tree.fit(X_train,y_train)
score = model.score(X_test,y_test)
print('%.4f'% score)

# 导入库
import graphviz
from sklearn.tree import export_graphviz

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度'
                ,'色调','od280/od315稀释葡萄酒','脯氨酸']

class_name = ["琴酒","雪莉","贝尔摩德"]


dot_data = export_graphviz(model
                           ,feature_names= feature_name
                           ,class_names = class_name
                           ,filled = True
                          )
graph = graphviz.Source(dot_data)
graph

主要需要调准的参数为
min_samples_split 内部节点再划分所需最小样本数 int, float, optional (default=2) 如果是 int,则取传入值本身作为最小样本数; 如果是 float,则取ceil(min_samples_split * 样本数量) 的值作为最小样本数,即向上取整。
min_samples_leaf 叶子节点最少样本数 int,float,optional(default = 1)这个值限制了叶子节点所需的最少样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
max_depth 决策树最大深度 int or None, optional (default=None) 一般来说,数据少或者特征少的时候采用默认值None,那么决策树将扩展节点直到所有叶子都是纯的或直到所有叶子包含少于min_samples_split样本;如果模型样本量多,特征也多的情况下,推荐限制这个最大深度;深度越大,越容易过拟合,推荐树的深度为:5-20之间
参数解释:https://blog.csdn.net/weixin_43026262/article/details/95473574

调参方法可以参考knn

三、回归决策树

# 是用回归决策树预测 y=sin(x) 正弦曲线
from sklearn.tree import DecisionTreeRegressor
# 画线
rng = np.random.RandomState() # 生成随机种子
X = np.sort(5*rng.rand(80,1),axis=0) # 生成 0 ~ 5 的随机数
y = np.sin(X).ravel()  # 生成 X对应的sin

plt.scatter(X,y)

# 加噪声
y[::5] += 2*(0.5-rng.rand(16))
plt.scatter(X,y)


# 实例化模型
reg1 = DecisionTreeRegressor(max_depth=5)
reg2 = DecisionTreeRegressor(max_depth=10)

# 训练
reg1.fit(X,y)
reg2.fit(X,y)

# 创建样本数据
X_test = np.arange(0.0,5.0,0.05).reshape(100,1)

y1 = reg1.predict(X_test)
y2 = reg2.predict(X_test)

# 可视化
plt.figure(figsize=[15,5])
plt.scatter(X,y,label = 'Train')
plt.scatter(X_test,y1, label = 'Max_Depth=5')
plt.scatter(X_test,y2, label='Max_Dept 10')
plt.legend()

随机森林

https://blog.csdn.net/qq_42479987/article/details/109549166
n_estimators:森林中决策树的数量。默认100
表示这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。

criterion:分裂节点所用的标准,可选“gini”, “entropy”,默认“gini”。

max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None。

min_samples_split:拆分内部节点所需的最少样本数:如果为int,则将min_samples_split视为最小值。如果为float,则min_samples_split是一个分数,而ceil(min_samples_split * n_samples)是每个拆分的最小样本数。默认是2。

min_samples_leaf:在叶节点处需要的最小样本数。仅在任何深度的分割点在左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时,才考虑。这可能具有平滑模型的效果,尤其是在回归中。如果为int,则将min_samples_leaf视为最小值。如果为float,则min_samples_leaf是分数,而ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。默认是1。

min_weight_fraction_leaf:在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。如果未提供sample_weight,则样本的权重相等。

max_features:寻找最佳分割时要考虑的特征数量:如果为int,则在每个拆分中考虑max_features个特征。如果为float,则max_features是一个分数,并在每次拆分时考虑int(max_features * n_features)个特征。如果为“auto”,则max_features = sqrt(n_features)。如果为“ sqrt”,则max_features = sqrt(n_features)。如果为“ log2”,则max_features = log2(n_features)。如果为None,则max_features = n_features。注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查多个max_features功能也是如此。

max_leaf_nodes:最大叶子节点数,整数,默认为None

min_impurity_decrease:如果分裂指标的减少量大于该值,则进行分裂。

min_impurity_split:决策树生长的最小纯净度。默认是0。自版本0.19起不推荐使用:不推荐使用min_impurity_split,而建议使用0.19中的min_impurity_decrease。min_impurity_split的默认值在0.23中已从1e-7更改为0,并将在0.25中删除。

bootstrap:是否进行bootstrap操作,bool。默认True。如果bootstrap==True,将每次有放回地随机选取样本,只有在extra-trees中,bootstrap=False

oob_score:是否使用袋外样本来估计泛化精度。默认False。

n_jobs:并行计算数。默认是None。

random_state:控制bootstrap的随机性以及选择样本的随机性。
verbose:在拟合和预测时控制详细程度。默认是0。

class_weight:每个类的权重,可以用字典的形式传入{class_label: weight}。如果选择了“balanced”,则输入的权重为n_samples / (n_classes * np.bincount(y))。

ccp_alpha:将选择成本复杂度最大且小于ccp_alpha的子树。默认情况下,不执行修剪。

max_samples:如果bootstrap为True,则从X抽取以训练每个基本分类器的样本数。如果为None(默认),则抽取X.shape [0]样本。如果为int,则抽取max_samples样本。如果为float,则抽取max_samples * X.shape [0]个样本。因此,max_samples应该在(0,1)中。是0.22版中的新功能。

from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

# 引入数据
wine = load_wine()
wine.data.shape

# 划分数据
X_train , X_test , y_train ,y_test = train_test_split(wine.data,wine.target ,test_size=0.2)

# 引入算法
rfc = RandomForestClassifier(random_state=1) # 随机森林
dtc = DecisionTreeClassifier(random_state=1) # 决策树

model_rfc = rfc.fit(X_train,y_train)
model_dtc = dtc.fit(X_train,y_train)

score_rfc = model_rfc.score(X_test,y_test)
score_dtc = model_dtc.score(X_test,y_test)

print('随机森林:%.4f , 决策树:%.4f'%(score_rfc, score_dtc))

# 数据交叉验证
em_rfc = RandomForestClassifier(random_state=100)
score1 = cross_val_score(em_rfc,wine.data, wine.target,cv=10)

em_dtc = DecisionTreeClassifier(random_state=100)
score2 = cross_val_score(em_dtc,wine.data,wine.target,cv=10)

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=[25,5])
plt.plot(range(1,11),score1 , label= '随机深林',c = 'red')
plt.plot(range(1,11),score2 ,label= '决策树',c='blue')
plt.legend()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值