机器学习算法基础(使用Python代码)

栏目: Python · 发布时间: 4年前

内容简介:谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化。-Eric Schmidt(Google董事长)我们可能生活在人类历史上最具决定性的时期。从大型的电脑主机到个人电脑再到云计算的时代。但是,它的定义并不是发生了什么,而是未来几年我们将面临什么。

机器学习算法基础(使用 <a href='https://www.codercto.com/topics/20097.html'>Python</a> 代码)

介绍

谷歌的自动驾驶汽车和机器人受到了很多媒体的关注,但该公司真正的未来是在机器学习领域,这种技术能使计算机变得更聪明,更个性化。-Eric Schmidt(Google董事长)

我们可能生活在人类历史上最具决定性的时期。从大型的电脑主机到个人电脑再到云计算的时代。但是,它的定义并不是发生了什么,而是未来几年我们将面临什么。

对于我这样的人来说,这段时期真的是让人兴奋和着迷的,因为随着技术的发展,各种 工具 和技术都实现了飞跃化,现在欢迎人类来到数据科学的世界!

今天,作为一名数据科学家,我可以用每小时几美元的成本,用复杂算法构建数据处理机器。但是实现这并不容易!因为我需要面临度过无数个黑暗的日日夜夜。

机器学习算法类型

从广义上讲,有3种类型的机器学习算法。

1.监督学习

工作原理:该算法由一个目标/结果变量(或因变量)组成,该变量将从给定的一组预测变量(自变量)中预测。使用这些变量集,我们生成一个将输入映射到所需输出的函数。训练过程继续进行,直到模型在训练数据上达到所需的准确度。监督学习的例子:回归,决策树,随机森林,KNN,逻辑回归等。

2.无监督学习

工作原理:在此算法中,我们没有任何目标或结果变量来进行预测/估计。它用于将人群进行聚类到不同群体中,广泛用于将客户划分到不同的群体中去并进行具体的干预。无监督学习的例子:Apriori算法,K-means。

3.强化学习:

工作原理:使用这种算法,机器经过培训,可以做出具体决策。它的工作原理是这样的:机器暴露在一个环境中,在这个环境中,它通过反复试验不断地训练自己。机器从过去的经验中学习,并尝试获取尽可能好的知识,以做出准确的业务决策。强化学习的例子:马尔可夫决策过程

常用机器学习算法列表

以下是常用机器学习算法的列表。这些算法几乎可以应用于任何数据问题:

  1. 线性回归
  2. 逻辑回归
  3. 决策树
  4. SVM
  5. 朴素贝叶斯
  6. k近邻
  7. K均值
  8. 随机森林
  9. 降维算法
  10. 梯度增强算法
  11. GBM
  12. XGBoost
  13. LightGBM
  14. CatBoost

1.线性回归

线性回归用于根据连续变量估算实际值(房屋成本,通话成本,总销售额等)。在这里,我们通过拟合一条直线来建立自变量和因变量之间的关系。该最佳拟合线称为回归线,并由线性方程Y = a * X + b表示。

理解线性回归的最佳方法是重温这种童年经历。让我们假设,你让一个五年级的孩子,通过体重增加的顺序来安排他们班级中的人,而不是通过问他们的体重!你觉得孩子会怎么做?他/她可能会在人的身高和体型上进行(视觉分析)安排,并使用这些可见参数的组合进行排列。这就是现实生活中的线性回归!这个孩子实际上已经发现高度和体格将通过一个关系与体重联系起来,就像上面的方程一样。

在这个等式中:

  • Y - 因变量
  • a - 坡度
  • X - 自变量
  • b - 拦截

这些系数a和b是基于最小化数据点和回归线之间的距离的平方差的总和而算出的。

请看下面的例子。在这里,我们确定了线性方程 y = 0.2811x + 13.9 的最佳拟合线。现在使用这个方程,我们可以求出重量,而知道一个人的身高。

创建本指南背后的想法是简化世界各地有抱负的数据科学家和机器学习爱好者的旅程。通过本指南,我将帮助您解决机器学习问题并从经验中获益。 我提供了对各种机器学习算法的高级理解以及运行它们的R&Python代码。这些应该足以弄脏你的手。

机器学习算法基础(使用Python代码)

线性回归主要有两种类型:简单线性回归和多元线性回归。简单线性回归的特征在于一个自变量。而多元线性回归(顾名思义)的特征是多个(超过1个)的自变量。在找到最佳拟合线时,可以拟合多项式或曲线回归。这些被称为多项式或曲线回归。

Python代码

Import Library

Import其他必要的库,如pandas,numpy ......

from sklearn import linear_model

读取训练集和测试集

识别特征和响应变量以及值必须是数字和numpy数组

x_train=input_variables_values_training_datasets

y_train=target_variables_values_training_datasets

x_test=input_variables_values_test_datasets

创建线性回归对象

linear = linear_model.LinearRegression()

使用训练集训练模型并检查分数

linear.fit(x_train, y_train)

linear.score(x_train, y_train)

方程系数和截距

print('Coefficient: n', linear.coef_)

print('Intercept: n', linear.intercept_)

预测输出

predicted = linear.predict(x_test)

2.逻辑回归

不要被它的名字搞混了!逻辑回归是一种分类而非回归算法。它用于根据给定的自变量集估计离散值(二进制值,如0/1,是/否,真/假)。简单来说,它通过将数据拟合到logit函数来预测事件发生的概率。因此,它也被称为 logit回归 。由于它预测概率,因此其输出值介于0和1之间(如预期的那样)。

让我们再一次通过一个简单的例子来尝试理解这一点。

假设你的朋友给你出了一个难题让你来解决。那只有2个结果场景 - 要么你成功的解决了它,要么你没能解决它。现在想象一下,你正在进行各种各样的解谜/测验,试图了解你擅长哪些科目。这项研究的结果应该是这样的 - 如果给你一个基于三角测量的十年级问题,你有70%的可能解决它。另一方面,如果是五年级的历史问题,获得答案的概率仅为30%。这就是逻辑回归为您提供的。

在数学中,结果的对数概率被建模为预测变量的线性组合。

odds = p /(1-p)=事件发生概率/非事件发生概率

ln(赔率)= ln(p /(1-p))

logit(p)= ln(p /(1-p))= b0 + b1X1 + b2X2 + b3X3 .... + bkXk

上面,p是存在感兴趣特征的概率。它选择的参数最大化的观察了样本值的可能性,而不是使误差平方和最小化(如普通回归)。

现在,你可能会问,为什么要记录对数?为简单起见,我们只是说这是复制跃阶函数的最佳数学方法之一。我可以介绍的更加仔细,但是这就会超出这篇文章所要描述的。

机器学习算法基础(使用Python代码)

Python代码

Import Library

from sklearn.linear_model import LogisticRegression

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的x(预测期)

Create logistic regression object

model = LogisticRegression()

使用训练集训练模型,并检查成绩

model.fit(X, y)

model.score(X, y)

查看方程系数和截距

print('Coefficient: n', model.coef_)

print('Intercept: n', model.intercept_)

预测输出

predicted= model.predict(x_test)

此外..

为了改进模型,可以尝试许多不同的步骤:

  • 包括互动条款
  • 删除功能
  • 正则化技术
  • 使用非线性模型

3.决策树

这是我最喜欢的算法之一,我经常使用它。决策树是一种监督学习算法,主要用于分类问题。让人惊喜的是,它适用于分类因变量和连续因变量。在该算法中,我们将总体分成两个或更多个同类集。这是基于最重要的属性/独立变量来完成的,以尽可能地形成不同的群体。

机器学习算法基础(使用Python代码)

在上图中,您可以看到人群根据多个属性分为四个不同的群体,以识别“他们是否会出去玩”。为了将人口分成不同的异构群体,决策树使用了各种技术,如基尼系数,信息增益,卡方,熵。

理解决策树如何工作的最好方法是玩Jezzball--一款来自微软的经典游戏(如下图所示)。基本上,你有一个移动墙壁的房间,你需要创建墙壁,以便最大限度的区域被球清除。

机器学习算法基础(使用Python代码)

所以,每次你用墙隔开房间时,你都是试图在同一个房间里创造2个不同的群体。决策树以非常类似的方式工作,通过将一个群体分成尽可能多的不同群体。

Python代码

导入 Library库

导入其他必要的库,如pandas, numpy...

from sklearn import tree

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建树对象

model = tree.DecisionTreeClassifier(criterion='gini') #对于分类,这里可以将算法更改为基尼系数或信息增益,默认为基尼系数

model = tree.DecisionTreeRegressor() for regression

使用训练集训练模型,并检查成绩

model.fit(X, y)

model.score(X, y)

预测输出

predicted= model.predict(x_test)

4. SVM(支持向量机)

这是一种分类方法。在此算法中,我们将每个数据项绘制为n维空间中的点(其中n是你拥有特征的数量),每个特性的值是特定坐标的值。

例如,如果我们只有两个特征,分别是一个人的身高和头发长度,我们首先在二维空间中绘制这两个变量,其中每个点有两个坐标(这些坐标称为 支持向量

机器学习算法基础(使用Python代码)

现在,找到一条线,这条线在两个不同分类的数据组之间进行分隔。这样的话这条直线最近的点的距离都是最远的。

机器学习算法基础(使用Python代码)

在上面的例子中,将数据分成两个不同分类组的线是黑色的,因为两个最接近的点距离线最远。这条线是我们的分类器。然后,根据测试数据落在线路两侧的位置,我们可以将新数据分类为哪一类。

可以将此算法视为在n维空间中玩JezzBall。游戏中的调整是:

  • 您可以在任何角度绘制线条/平面(而不是像经典游戏中那样只能画水平或垂直线)
  • 游戏的目的是在不同的房间隔离不同颜色的球。
  • 并且球没有移动。

Python代码

Import Library

from sklearn import svm

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建SVM分类对象

model = svm.svc() # 有各种各样的选型相关,这对于分类来说很简单,可以参考函数的详细信息

使用训练集训练模型,并检查成绩

model.fit(X, y)

model.score(X, y)

输出预测

predicted= model.predict(x_test)

5.朴素贝叶斯

它是一种基于贝叶斯定理的分类技术 ,假设在预测变量之间具有独立性。简单来说,朴素贝叶斯分类器假设类中某个特定特征的存在与任何其他特征的存在无关。例如,如果水果是红色的,圆形的,直径约3英寸,则可以认为它是苹果。即使这些特征相互依赖或依赖于其他特征的存在,一个朴素的贝叶斯分类器会认为所有这些特性都独立地促成了这种水果是苹果的概率。

朴素贝叶斯模型易于构建,特别适用于非常大的数据集。除简单之外,朴素贝叶斯的性能甚至超过了非常复杂的分类方法。

贝叶斯定理提供了一种从P(c),P(x)和P(x | c)计算后验概率P(c | x)的方法。请看下面的方程:

机器学习算法基础(使用Python代码)

方程中,

  • Pc | x )是给定预测器(属性)的类(目标)的后验概率。
  • PC ^ )是类的先验概率。
  • Px | c )为似然值,即给定类别的预测器概率。
  • Px )是预测器的先验概率。

示例:让我们用一个例子来理解它。下面我有一个天气训练数据集和相应的目标变量'Play'。现在,我们需要根据天气情况对玩家是否出去玩进行分类。让我们按照以下步骤执行它。

第1步:将数据集转换为频率表

步骤2:通过找到阴天概率为0.29和出去玩的概率为0.64的概率来创建似然表。

机器学习算法基础(使用Python代码)

步骤3:现在,使用朴素贝叶斯方程计算每个类的后验概率。具有最高后验概率的一类就是预测的结果。

问题:如果天气晴朗,玩家会出去玩,这个说法是否正确?

我们可以使用上面讨论的方法解决它,所以P(出去| 阳光充足)= P(阳光充足 | 出去)* P(出去)/ P(阳光充足)

这里有P(阳光充足 |出去)= 3/9 = 0.33,P(阳光充足)= 5/14 = 0.36,P(出去)= 9/14 = 0.64

现在,P(出去| 阳光充足)= 0.33 * 0.64 / 0.36 = 0.60,概率更高。

朴素贝叶斯使用类似的方法根据各种属性预测不同类别的概率。该算法主要用于文本分类,并且具有多个类的问题。

Python代码

Import Library

from sklearn.naive_bayes import GaussianNB

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

Create SVM classification object model = GaussianNB() # 对于多项式类,还有其他的分布,如伯努利朴素贝叶斯,可以查看函数的详细内容

使用训练集训练模型,并检查成绩

model.fit(X, y)

输出预测

predicted= model.predict(x_test)

6. KNN(k-近邻)

KNN可以用于分类和回归问题。然而,它更广泛地用于行业中的分类问题。K近邻是一种简单的算法,它存储所有可用的案例,并通过其k个近邻的点进行多数投票对新案例进行分类。分配给该类的情况在由距离函数测量的其K个最近邻中决定。

这些距离函数可以是欧几里得距离,曼哈顿距离,闵可夫斯基和汉明距离。前三个函数用于连续函数,第四个函数(汉明)用于分类变量。如果K = 1,则将该案例简单地分配给其最近邻的类别。有时候,选择K的值在执行KNN建模时是一个挑战。

机器学习算法基础(使用Python代码)

KNN很容易映射到我们的现实生活中。如果你想了解一个你不了解的人,你可以通过他/她的朋友和他/她所处在的圈子,轻松的了解到他/她是什么样的人!

选择KNN之前需要考虑的事项:

  • KNN在计算上很昂贵
  • 变量应该归一化,否则较大范围的变量会产生偏差
  • 在使用KNN之前需要进行一些预处理工作比如:异常值、噪声的去除

Python代码

Import Library

from sklearn.neighbors import KNeighborsClassifier

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建KNN分类器对象模型

KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 5

使用训练集训练模型,并检查成绩

model.fit(X, y)

输出预测

predicted= model.predict(x_test)

7. K-Means

K-Means是一种无监督算法,可以解决聚类问题。其过程遵循一种简单易行的方法,通过一定数量的簇(假设有k个簇)对给定数据集进行分类。集群内的数据点对于同一个组来说是同构和异构的。

还记得从墨迹中找出形状吗?k-Means的意思就有点类似于从墨迹中找形状。你看这个形状然后把它分散开来,然后解释这里有多少不同的簇!

机器学习算法基础(使用Python代码)

K-means如何形成簇:

  1. K-means为称为中心的每个簇选择k个点。
  2. 每个数据点形成一个离中心最近的簇,即K簇。
  3. 根据现有集群成员查找每个集群的质心。然后,生成新的质心。
  4. 当我们有新的质心时,重复第二步和第三步.找到每个数据点与新质心的最近距离,并与新的k-簇相关联。重复此过程直到收敛发生,即质心不会改变。

如何确定K的值:

在K-means中,我们有簇,每个簇都有自己的质心。质心和簇内数据点之间的差的平方和构成该簇的平方值的总和。此外,当添加所有簇的平方和时,它在聚类解的平方值之和内变为总和。

我们知道随着聚类数量的增加,这个值会继不断减小,但是如果你绘制出结果,你可能会看到平方和会急剧下降到某个k值,然后会慢得多。在这里,我们可以找到最佳的簇数。

机器学习算法基础(使用Python代码)

Python代码

Import Library

from sklearn.cluster import KMeans

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建K-means分类器对象模型

k_means = KMeans(n_clusters=3, random_state=0)

使用训练集训练模型,并检查成绩

model.fit(X)

输出预测

predicted= model.predict(x_test)

8.随机森林

随机森林是决策树集合的专业术语。在随机森林中,我们收集了决策树(俗称“森林”)。为了根据属性对新对象进行分类,每个树都给出一个分类,然后通过每个数进行投票。新的对象选择那个投票最多的分类(在森林中的所有树中)。

每棵树的种植和生长方式如下:

  1. 如果训练集中的案例数是N,那么N个案例的样本是随机抽取,并进行替换。这个样本将是用于作为树的训练集。
  2. 如果存在M个输入变量,则指定数字m << M,使得在每个节点处,从M中随机选择m个变量,并且使用这些m上的最佳分割来分割节点。在森林生长期间,m的值保持不变。
  3. 每棵树都尽可能地生长。不需要剪枝。
  • Pyhon代码

Import Library

from sklearn.ensemble import RandomForestClassifier

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建随机森林对象

model= RandomForestClassifier()

使用训练集训练模型,并检查成绩

model.fit(X, y)

输出预测

predicted= model.predict(x_test)

9.维度降低算法

在过去的4到5年中,每个可能阶段的数据捕获都呈指数级增长。企业/政府机构/研究机构不仅提供新的资源,而且还非常详细地捕获数据。

例如:电子商务公司正在捕捉有关客户的更多详细信息,例如他们的人口统计数据,网络抓取历史记录,他们喜欢或不喜欢的内容,购买历史记录,反馈以及许多其他人,比最近的杂货店主更多地给予他们个性化的关注。

作为一名数据科学家,我们提供的数据也包含许多功能,这对于构建良好的稳健模型非常有用,但是存在挑战。你如何确定1000或2000以外的重要变量?在这种情况下,降维算法可以帮助我们与各种其他算法一起使用,例如决策树,随机森林,PCA,因子分析,基于相关矩阵的识别,缺失值比率等。

Python代码

Import Library

from sklearn import decomposition

假设你拥有训练和测试数据集作为训练和测试

Create PCA obeject pca= decomposition.PCA(n_components=k) #k=min的默认值(n个样本,n个特征)

进行因子分析

fa= decomposition.FactorAnalysis()

使用PCA降低训练数据集的维数

train_reduced = pca.fit_transform(train)

减少测试数据集的维数

test_reduced = pca.transform(test)

更多细节请查看帮助文档

10.梯度增强算法

10.1 GBM

GBM是一种用于处理大量数据进行预测的增强算法,具有较高的预测能力。Boosting实际上是一种学习算法集合,它结合了多个基本预测器的预测能力,以提高单个预测器的稳健性。它将多个弱预测器或平均预测器组合成一个强大的预测器。这些增强算法在Kaggle,AV Hackathon,CrowdAnalytix等数据科学竞赛中始终运行良好。

Python代码

Import Library

from sklearn.ensemble import GradientBoostingClassifier

假设你有用于训练数据集的X(预测器)和Y(目标),以及测试集的X(预测器)

创建梯度增强分类器对象

model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)

使用训练集训练模型,并检查成绩

model.fit(X, y)

输出预测

predicted= model.predict(x_test)

10.2 XGBoost

另一种经典的梯度增强算法,在一些Kaggle比赛中被认为是决定输赢的选择。

XGBoost具有极高的预测能力,它同时具有线性模型和树模型的学习算法,使得该算法的速度几乎是现有的梯度增强技术的10倍,是确保事件精度的最佳选择。

支持包括各种目标函数,包括回归,分类和排序。

关于XGBoost最有趣的事情之一是,它也被称为正则化增强技术。这有助于减少过度拟合建模,并对Scala,Java,R,Python,Julia和C ++等一系列语言提供强大的支持。

支持在包含GCE,AWS,Azure和Yarn集群的许多机器上进行分布式和广泛的训练。XGBoost还可以与Spark,Flink和其他云数据流系统集成,并在每次升级过程中进行内置交叉验证。

Python代码:

from xgboost import XGBClassifier

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

X = dataset[:,0:10]

Y = dataset[:,10:]

seed = 1

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)

model = XGBClassifier()

model.fit(X_train, y_train)

对测试数据进行预测

y_pred = model.predict(X_test)

10.3 LightGBM

LightGBM是一种使用基于树的学习算法的梯度增强框架。它被设计成为分布式和具有高效性,有以下优点,:

  • 更快的培训速度和更高的效率
  • 降低内存使用
  • 更准确的精度
  • 支持并行和GPU学习
  • 能够处理大规模数据

该框架是一种基于决策树算法,快速高性能的梯度增强框架,,用于排序,分类和许多其他机器学习任务。它是在Microsoft的分布式机器学习工具包项目下开发的。

由于LightGBM基于决策树算法,因此它以最佳拟合分割树叶,而其他提升算法则以深度或水平方向分割而不是树叶方向分割。因此,当在Light GBM中生长在相同的叶子上时,叶子算法可以比水平算法减少更多的损失,因此导致更好的精度,这是任何现有的增强算法都很难实现的。

而且,它非常的快,因此才有了“Light”这个词。

Python代码:

data = np.random.rand(500, 10) # 500个实体,每个包含10个特性

label = np.random.randint(2, size=500) #二进制目标

train_data = lgb.Dataset(data, label=label)

test_data = train_data.create_valid('test.svm')

param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}

param['metric'] = 'auc'

num_round = 10

bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])

bst.save_model('model.txt')

7个实体,每个包含10个特性

data = np.random.rand(7, 10)

ypred = bst.predict(data)

10.4 Catboost

CatBoost是Yandex最近开发的一种开源的机器学习算法。它可以轻松地与Google的TensorFlow和Apple的Core ML等深度学习框架进行集成。

关于CatBoost最好的优点是它不像其他ML模型那样需要大量的数据训练,并且可以处理各种数据格式; 并不会削弱它的强大能力。

但是在Catboost之前,请确保已妥善处理好缺失的数据了。

Catboost可以在不显示类型转换错误的情况下自动处理分类变量,这有助于您专注于更好地优化模型,而不是整理出琐碎的错误。

Python代码:

import pandas as pd

import numpy as np

from catboost import CatBoostRegressor

读取训练集和测试集的文件

train = pd.read_csv("train.csv")

test = pd.read_csv("test.csv")

为训练集和测试集计算缺失值

train.fillna(-999, inplace=True)

test.fillna(-999,inplace=True)

为建模和验证集创建训练集,以检查模型性能

X = train.drop(['Item_Outlet_Sales'], axis=1)

y = train.Item_Outlet_Sales

from sklearn.model_selection import train_test_split

X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)

categorical_features_indices = np.where(X.dtypes != np.float)[0]

导入库并构建模型

from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')

model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)

submission = pd.DataFrame()

submission['Item_Identifier'] = test['Item_Identifier']

submission['Outlet_Identifier'] = test['Outlet_Identifier']

submission['Item_Outlet_Sales'] = model.predict(test)

结束语

到目前为止,我相信,你已经了解这些常用的机器学习算法。如果您热衷于掌握机器学习,请立即开始处理问题,通过对问题进行处理,并应用这些代码,那你肯定会感到兴趣,然后在机器学习这条道路上走下去!

Essentials of Machine Learning Algorithms (with Python and R Codes)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Understanding Machine Learning

Understanding Machine Learning

Shai Shalev-Shwartz、Shai Ben-David / Cambridge University Press / 2014 / USD 48.51

Machine learning is one of the fastest growing areas of computer science, with far-reaching applications. The aim of this textbook is to introduce machine learning, and the algorithmic paradigms it of......一起来看看 《Understanding Machine Learning》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具