[机器学习篇]基于Scikit learn库中KNN,SVM算法的笔迹识别

前言

这里介绍,如何运用Scikit learn库中的KNN,SVM算法进行笔迹识别。

数据说明:

数据共有785列,第一列为label,剩下的784列数据存储的是灰度图像(0~255)的像素值 28*28=784

安装scikit learn库

看了很多安装教程,都没有安装成功。最后参考了官方网站的安装文档,只需要一步步照着做下来就能成功安装scikit learn 安装文档

函数介绍:

主成分分析(Principal components analysis,PCA):

一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。过程是求协方差矩阵的特征值与特征向量,通过保留低阶主成分,忽略高阶主成分。这样低阶成分往往能够保留住数据的最重要方面。
c.f.:svd奇异值分析
实际中会用svd奇异值分析去代替它,因为pca计算量比较大。

from sklearn.decomposition import PCA
#从sklearn中导入PCA
pca = PCA(n_components=0.8,whiten=True)
#设置PCA参数
#n_components:
#设为大于零的整数,会自动的选取n个主成分,
#设为分数时,选择特征值占总特征值大于n的,作为主成分
#whiten:
#True表示做白化处理,白化处理主要是为了使处理后的数据方差都一致
pca.fit_transform(data)
pca.transform(data)
#对数据data进行主成分分析


from sklearn.neighbors import KNeighborsClassifier
#导入Scikit learn库中的KNN算法

neighbors=kneighbors([X, n_neighbors, return_distance])
#找到一个点的K近邻,n_neighbors近邻的数目
neighbors.fit(Training data,Target values)
#对训练集的输入和输出进行训练
pre= neighbors.predict(Test samples)
#对测试集的输入进行预测,返回预测出的标签

    KNN完整程序及注解

    import pandas as pd
    from sklearn.decomposition import PCA
    from sklearn.neighbors import KNeighborsClassifier
    import time
    
    if __name__ =="__main__":
        train_num = 20000
        test_num = 30000
        data = pd.read_csv('train.csv')
        train_data = data.values[0:train_num,1:]
        train_label = data.values[0:train_num,0]
        test_data = data.values[train_num:test_num,1:]
        test_label = data.values[train_num:test_num,0]
    
        t = time.time()
        pca=PCA(n_components = 0.8)
        train_x = pca.fit_transform(train_data)
        test_x = pca.transform(test_data)
        neighbors = KNeighborsClassifier(n_neighbors=4)
        neighbors.fit(train_x,train_label)
        pre= neighbors.predict(test_x)
    
        acc = float((pre==test_label).sum())/len(test_x)
        print u'准确率:%f,花费时间:%.2fs' %(acc,time.time()-t)

      运行结果:

      准确率:0.946000,花费时间:7.98s

      svm方法:

      支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。
      支持向量机建构一个或多个高维的超平面来分类资料点,这个超平面即为分类边界。直观来说,好的分类边界要距离最近的训练资料点越远越好。在支持向量机中,分类边界与最近的训练资料点之间的距离称为间隔(margin);支持向量机的目标即为找出间隔最大的超平面来作为分类边界。

      from sklearn import svm
      #从sklearn库中导入svm

      SVC函数

      svc=svm.SVC(*C=1.0*, *kernel='rbf'*, *degree=3*)
      #C是惩罚因子
      #kernel核方法,常用的核方法有:‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
      svc.fit(X, y, sample_weight=None)
      #对训练集的输入和输出进行训练
      svc.predict(x)
      #对测试集的输入进行预测,返回预测出的标签
      #####SVM完整程序及注解
        import pandas as pd
        from sklearn.decomposition import PCA
        from sklearn import svm
        import time
        
        if __name__ =="__main__":
            train_num = 5000
            test_num = 7000
            data = pd.read_csv('train.csv')
            train_data = data.values[0:train_num,1:]
            train_label = data.values[0:train_num,0]
            test_data = data.values[train_num:test_num,1:]
            test_label = data.values[train_num:test_num,0]
            t = time.time()
            #svm方法
            pca = PCA(n_components = 0.8,whiten = True)
            train_x = pca.fit_transform(train_data)
            test_x = pca.transform(test_data)
            svc = svm.SVC(kernel = 'rbf',C = 10)
            svc.fit(train_x,train_label)
            pre = svc.predict(test_x)
            acc = float((pre==test_label).sum())/len(test_x)
            print u'准确率:%f,花费时间:%.2fs' %(acc,time.time()-t)

          运行结果:

          准确率:0.953000,花费时间:13.95s

          对比:

          在对5000个数据进行训练,2000个数据进行测试的过程中,SVM比KNN的准确率更高,所用时间更长。







          ### scikit-learn 中的分类算法及其使用指南 #### 什么是 scikit-learnscikit-learn 是一个功能强大且易于使用的 Python ,专为数据挖掘和数据分析而设计。它提供了丰富的机器学习算法,涵盖了监督学习、无监督学习以及其他实用工具[^1]。 --- #### scikit-learn 提供的主要分类算法 以下是 scikit-learn 中常见的分类算法及其特点: ##### 1. **逻辑回归 (Logistic Regression)** 逻辑回归是一种经典的线性分类模型,适合于二分类问题。它可以扩展到多分类任务(如 One-vs-Rest 或 Multinomial Logistic Regression)。 - 特点:简单高效,适用于低维度特征空间。 - 使用方法: ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明[^2] ##### 2. **支持向量机 (Support Vector Machine, SVM)** SVM 寻找最优超平面以最大化不同类别间的间隔,特别适合高维数据集。可以通过核函数(Kernel Function)处理非线性可分的情况。 - 特点:鲁棒性强,但计算成本较高。 - 使用方法: ```python from sklearn.svm import SVC model = SVC(kernel='rbf') # 'linear', 'poly', 'rbf' model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明 ##### 3. **决策树 (Decision Tree)** 决策树通过递归分割特征空间构建一棵树形结构,每片叶子对应一个类别标签。可以用于分类和回归任务。 - 特点:易于理解和可视化,但可能过拟合。 - 使用方法: ```python from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier(max_depth=5) # 控制树深防止过拟合 model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明[^3] ##### 4. **随机森林 (Random Forest)** 随机森林是由多个决策树组成的集成模型,采用 bagging 方法减少单棵树的方差。 - 特点:抗噪能力强,泛化性能好。 - 使用方法: ```python from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=100, max_depth=5) model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明 ##### 5. **K近邻 (K-Nearest Neighbors, KNN)** KNN 属于懒惰学习法,预测时基于训练集中最接近的 k 个样本进行投票或加权平均。 - 特点:无需显式训练过程,但对大数据集效率较低。 - 使用方法: ```python from sklearn.neighbors import KNeighborsClassifier model = KNeighborsClassifier(n_neighbors=5) model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明 ##### 6. **朴素贝叶斯 (Naive Bayes)** 朴素贝叶斯是一系列基于贝叶斯定理的概率分类器,假设各特征间相互独立。常用变种有 GaussianNB 和 MultinomialNB。 - 特点:计算速度快,适合文本分类等稀疏数据场景。 - 使用方法: ```python from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明[^1] ##### 7. **梯度提升决策树 (Gradient Boosting Decision Trees, GBDT)** GBDT 是一种增强型集成方法,通过逐步修正前序模型的残差来提高整体表现。 - 特点:精度高,但训练时间较长。 - 使用方法: ```python from sklearn.ensemble import GradientBoostingClassifier model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` - 参考说明 --- #### 数据预处理与模型评估流程 为了更好地应用上述分类算法,通常需要完成以下步骤: 1. 加载并准备数据; 2. 对数据进行标准化/归一化处理; 3. 划分训练集和测试集; 4. 训练选定的分类模型; 5. 评估模型性能。 示例代码如下: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score # 加载数据 data = load_iris() X, y = data.data, data.target # 数据划分 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 定义模型 model = LogisticRegression() # 训练模型 model.fit(X_train, y_train) # 预测与评估 y_pred = model.predict(X_test) print(f'Accuracy: {accuracy_score(y_test, y_pred)}') ``` --- #### 性能优化建议 - 调整超参数(Hyperparameter Tuning),例如 `max_depth`、`n_estimators` 等。 - 使用交叉验证(Cross Validation)评估模型稳定性。 - 尝试不同的特征选择方法以降低维度。 --- ###
          评论 1
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

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

          抵扣说明:

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

          余额充值