【必须掌握】支持模型训练常用的八个基础算法

构建和训练机器学习模型中,需要经常对数据进行分类,划分训练集和测试集,在这些日常工作中,我们必须使用脚本对数据进行处理,无论是分类、回归还是聚类,这些脚本都能让你效率大增,这些脚本有哪些呢?

1、决策树分类器

决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

从数据产生决策树的机器学习技术叫做决策树学习, 通俗说就是决策树。

一个决策树包含三种类型的节点:

1.决策节点:通常用矩形框来表示

2.机会节点:通常用圆圈来表示

3.终结点:通常用三角形来表示

Python代码实现:
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建决策树分类器实例
clf = DecisionTreeClassifier()

# 训练模型
clf.fit(X_train, y_train)

# 测试模型
accuracy = clf.score(X_test, y_test)
print(f"Accuracy: {accuracy}")

2、支持向量机

支持向量机(SVM,Support Vecor Machine)是一种二分类算法,在集成学习和深度学习火起来之前支持向量机的使用非常广泛,其分类效果好、适用性广(线性、非线性都可用),功能真的是很棒棒

Python代码实现:
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

#划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建SVM模型实例
svm = SVC(kernel='linear')

# 训练模型
svm.fit(X_train, y_train)

# 测试模型
accuracy = svm.score(X_test, y_test)
print(f"Accuracy: {accuracy}")

3、K-Means聚类

K-Means 聚类是一种非常流行的聚类算法,主要用于将数据分成预先定义的 K 个类别。这种方法广泛应用于数据挖掘、图像处理、市场细分等领域。下面我将详细介绍 K-Means 算法的基本原理、步骤以及如何使用 Python 实现。
基本原理

K-Means 算法基于以下步骤:

    初始化:随机选择 K 个数据点作为初始的聚类中心。

    分配:将每个数据点分配给最近的聚类中心,形成 K 个聚类。

    更新:重新计算每个聚类的中心(即聚类内所有点的均值)。

    迭代:重复步骤 2 和 3,直到聚类中心不再变化(或变化非常小),或者达到一定的迭代次数。

算法步骤

    选择初始中心:

        可以随机选择 K 个点作为初始中心。

        或者使用 K-Means++ 方法来选择初始中心,以提高算法的性能和收敛速度。

    分配步骤:对于每个点,计算其与每个聚类中心的距离(通常使用欧氏距离)。

        将该点分配给最近的聚类中心。

    更新中心:计算每个聚类中所有点的均值,并将该均值作为新的聚类中心。

   重复分配和更新步骤,直到满足停止条件(例如,聚类中心的变化小于某个阈值,或达到最大迭代次数)。

Python代码实现:
from sklearn.cluster import KMeans
import numpy as np
 
# 示例数据
X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])
 
# 创建 KMeans 实例并设置 K 的值(聚类数目)
kmeans = KMeans(n_clusters=2, random_state=0)
 
# 拟合模型
kmeans.fit(X)
 
# 预测聚类标签
labels = kmeans.predict(X)
print("聚类标签:", labels)
 
# 获取聚类中心
centers = kmeans.cluster_centers_
print("聚类中心:", centers)

4、线性回归模型

线性回归(Linear Regression)是是指在统计学中是指在统计学中用来描述一个或者多个自变量和一个因变量之间线性关系的回归模型。

在进行线性回归分析之前,我们首先要检查我们的问题是否满足线性回归的假设(这很重要!!)

线性回归模型主要满足以下假设

线性回归模型当然首先要求待解决问题中的因变量和自变量满足线性关系;如果两者之间并不满足线性关系,则不应该采用线性回归模型

我们可以通过画出因变量y与每一个自变量x之间的散点图,来观察两者之间是否存在线性关系

Homoscedasticity 是指在一个模型中,因变量的方差并不会随着自变量的变化而变化,另一种表述方式是模型的残差并不随着因变量y或者预测值y的变化而变化 ; 或者残差的方差不会随着因变量y或者预测值y的变化而变化;具体可以看下面的例子

比如收入和年龄之间的关系,年轻的时候,因为工作机会有限,我们大部分人的收入比较一致;但随着年龄的增大,就业机会多样化,人与人之间的薪资就会出现差异,有的人挣了很多钱,而有的人则挣钱比较少;那么在年轻时的收入方差和年龄大一些时的收入方差是不一致的,这种情况就不是Homoscedasticity

Python代码实现:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression
】
# 生成模拟数据
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建线性回归模型实例
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 测试模型
score = model.score(X_test, y_test)
print(f"Score: {score}")

5、随机森林分类器

随机森林是一个集成学习方法,

随机森林实际上就是一堆捆绑在一起的决策树。
这是对的,但是有点简化了。

Bagging考虑以下算法来训练给定n点数据集的一组决策树:

  • 从数据集中抽取样本,并替换n训练实例。
  • 在神经网络样本上训练决策树。
  • 对一些t重复t次数。

为了使用该模型对t树进行预测,我们将来自各个决策树的预测进行聚合:

  • 如果我们的树产生了类标签(比如颜色),请进行多数票。
  • 如果我们的树产生数值(例如预测温度、价格等),则取平均值。

这种技术称为bagging,或bootstrap聚合。我们所做的带有替换的抽样称为引导抽样(bootstrap sample)

Python代码实现:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建随机森林分类器实例
rf = RandomForestClassifier(n_estimators=100)

# 训练模型
rf.fit(X_train, y_train)

# 测试模型
accuracy = rf.score(X_test, y_test)
print(f"Accuracy: {accuracy}")

6、特征缩放

在处理多维特征问题的时候,需要保证特征具有相近的尺度,这有助于梯度下降算法更快的收敛。
以预测房屋价格为例,假设有两个特征,房屋的尺寸和房屋的数量,尺寸的值为 0-
2000 平方英尺,而房间数量的值则是 0-5,以两个参数分别为横纵坐标,绘制代价函数的等
高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。、

特征缩放方法

   1.最大值最小值归一化

   2.方差归一化

   3.均值归一化

   4.标准归一化

Python代码实现:
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_regression

# 生成模拟数据
X, y = make_regression(n_samples=100, n_features=2, noise=0.1)

# 创建特征缩放工具实例
scaler = StandardScaler()

# 缩放特征
X_scaled = scaler.fit_transform(X)

print(f"Scaled features: {X_scaled}")

7、交叉验证

交叉验证(Cross Validation,CV)是一种常见的模型评估方法。简言之,就是将样本分为训练集(tranning set)和测试集(test set),训练集用来估计模型参数,测试集用来评价模型精度

常用交叉验证方法:

  • HoldOut 交叉验证

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
iris=load_iris()
X=iris.data
Y=iris.target
print("Size of Dataset {}".format(len(X)))
logreg=LogisticRegression()
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3,random_state=42)
logreg.fit(x_train,y_train)
predict=logreg.predict(x_test)
print("Accuracy score on training set is {}".format(accuracy_score(logreg.predict(x_train),y_train)))
print("Accuracy score on test set is {}".format(accuracy_score(predict,y_test)))
  • K-Fold 交叉验证

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score,KFold
from sklearn.linear_model import LogisticRegression
iris=load_iris()
X=iris.data
Y=iris.target
logreg=LogisticRegression()
kf=KFold(n_splits=5)
score=cross_val_score(logreg,X,Y,cv=kf)
print("Cross Validation Scores are {}".format(score))
print("Average Cross Validation score :{}".format(score.mean()))

  • 分层 K-Fold交叉验证

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score,StratifiedKFold
from sklearn.linear_model import LogisticRegression
iris=load_iris()
X=iris.data
Y=iris.target
logreg=LogisticRegression()
stratifiedkf=StratifiedKFold(n_splits=5)
score=cross_val_score(logreg,X,Y,cv=stratifiedkf)
print("Cross Validation Scores are {}".format(score))
print("Average Cross Validation score :{}".format(score.mean()))
  • Leave P Out 交叉验证

from sklearn.model_selection import LeavePOut,cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris=load_iris()
X=iris.data
Y=iris.target
lpo=LeavePOut(p=2)
lpo.get_n_splits(X)
tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1)
score=cross_val_score(tree,X,Y,cv=lpo)
print("Cross Validation Scores are {}".format(score))
print("Average Cross Validation score :{}".format(score.mean()))
  • 留一交叉验证

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import LeaveOneOut,cross_val_score
iris=load_iris()
X=iris.data
Y=iris.target
loo=LeaveOneOut()
tree=RandomForestClassifier(n_estimators=10,max_depth=5,n_jobs=-1)
score=cross_val_score(tree,X,Y,cv=loo)
print("Cross Validation Scores are {}".format(score))
print("Average Cross Validation score :{}".format(score.mean()))
  • 蒙特卡洛 (Shuffle-Split)

from sklearn.model_selection import ShuffleSplit,cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
logreg=LogisticRegression()
shuffle_split=ShuffleSplit(test_size=0.3,train_size=0.5,n_splits=10)
scores=cross_val_score(logreg,iris.data,iris.target,cv=shuffle_split)
print("cross Validation scores:n {}".format(scores))
print("Average Cross Validation score :{}".format(scores.mean()))
  • 时间序列(滚动交叉验证)

import numpy as np
from sklearn.model_selection import TimeSeriesSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4, 5, 6])
time_series = TimeSeriesSplit()
print(time_series)
for train_index, test_index in time_series.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

8、神经网络

神经网络是深度学习的基础,以下是一个简单的神经网络脚本示例。

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits

# 加载数据
digits = load_digits()
X, y = digits.data, digits.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建神经网络模型实例
mlp = MLPClassifier(hidden_layer_sizes=(50,), max_iter=1000)

# 训练模型
mlp.fit(X_train, y_train)

# 测试模型
accuracy = mlp.score(X_test, y_test)
print(f"Accuracy: {accuracy}")

以上工具脚本都是机器学习实践中总结出来的,可以直接应用到你的项目中。代码可以根据你的具体需求进行调整,只要它们能够解决问题。记得在实际应用中做好异常处理,以免程序因为一个错误而完全崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值