python 机器学习 - Go语言中文社区

python 机器学习


<一>:特征工程:将原始数据转化为算法数据

一:特征值抽取

1:对字典数据 :from sklearn.feature_extraction import DictVectorizer

import pandas as pd
import numpy as np

from sklearn.feature_extraction import DictVectorizer

def dict_func():
    '''
    将字典数据做特征抽取(类别默认进行one-hot编码)
    :return:None 
    '''
    dict_ = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    dv = DictVectorizer(sparse=False)
    data = dv.fit_transform(dict_)
    print(data)                           #  获取转化后的数据    (类别问题 已经进行过one-hot编码)
    print(dv.get_feature_names())         #  获取特征名
    print(dv.inverse_transform(data))     #  将转化后的数据转化为原数据
    '''
    data: [[  0.   1.   0. 100.]
     [  1.   0.   0.  60.]
     [  0.   0.   1.  30.]]
     
    特征名: ['city=上海', 'city=北京', 'city=深圳', 'temperature']
    
    原数据:[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
    '''

 

2:对文本特征抽取:from sklearn.feature_extraction.text import CountVectorizer

def text_func():
    '''
    将文本数据做特征抽取 (默认单个字母或中文不加入特征)
    :return:None
    '''
    text = '随着自然语言处理领域的顶级盛会 ACL 2019 落幕,亚马逊 Alexa AI 的机器学习科学家 Mihail Eric 对本次会议进行了一次比较全面的回顾。从奇闻轶事到学术前沿,本文一网打尽,自然语言处理领域的小伙伴们不要错过!'
    text_jieba = jieba.cut(text)
    a = list(text_jieba)
    text_data = ' '.join(a)    #   随着 自然语言 处理 领域 的 顶级 盛会   ACL   2019   落幕 , 亚马逊   Alexa   AI   的 机器 学习 科学家   Mihail   Eric   对 本次 会议 进行 了 一次 比较 全面 的 回顾 。 从 奇闻 轶事 到 学术前沿 , 本文 一网打尽 , 自然语言 处理 领域 的 小伙伴 们 不要 错过 !

    cv = CountVectorizer()
    data = cv.fit_transform([text_data,])
    print(cv.get_feature_names())
    print(data.toarray())     #  将数据转化为array类型
    '''
    结果:
    ['2019', 'acl', 'ai', 'alexa', 'eric', 'mihail', '一次', '一网打尽', '不要', '亚马逊', '会议', '全面', '回顾', '处理', '奇闻', '学习', '学术前沿', '小伙伴', '本文', '本次', '机器', '比较', '盛会', '科学家', '自然语言', '落幕', '轶事', '进行', '错过', '随着', '顶级', '领域']
    [[1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2]]
    '''
    return None

 

3:TF-IDF表示词在全文中的重要性(结果显示为概率值)    :from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer

def tfidf_func():
    '''
    TF-IDF表示词在全文中的重要性(结果显示为概率值)
    :return:
    '''
    text = ["life is short,i like python", "life is too long,i dislike python"]
    tf = TfidfVectorizer()
    data = tf.fit_transform(text)
    print(tf.get_feature_names())
    print(data.toarray())
    '''
    特征名:['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
    占全文概率:  [[0.         0.37930349 0.37930349 0.53309782 0.         0.37930349
      0.53309782 0.        ]
     [0.47042643 0.33471228 0.33471228 0.         0.47042643 0.33471228
      0.         0.47042643]]
    '''
    return None

 

二:特征值预处理

1:归一化

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,容易受异常数据的影响(比如某个值异常大或异常小)。常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间

公式:

    

注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

from sklearn.preprocessing import MinMaxScaler,StandardScaler
def minmaxscaler():
    """
    归一化:默认是将数据转化为 0-1 之间的数据
    :return:
    """
    num = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    mm = MinMaxScaler()
    data = mm.fit_transform(num)
    print(data)
    '''
    data:
    [[1.         0.         0.         0.        ]
     [0.         1.         1.         0.83333333]
     [0.5        0.5        0.6        1.        ]]
    '''
    return None

 

2 :标准化

特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内,解决了异常数据的影响

公式:

注:作用于每一列,mean为平均值,?为标准差(考量数据的稳定性)

from sklearn.preprocessing import MinMaxScaler,StandardScaler
def standerscaler():
    """
    标准化处理
    :return:
    """
    num = num = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    std = StandardScaler()
    data = std.fit_transform(num)
    print(data)
    '''
    结果:
    [[ 1.22474487 -1.22474487 -1.29777137 -1.3970014 ]
     [-1.22474487  1.22474487  1.13554995  0.50800051]
     [ 0.          0.          0.16222142  0.88900089]]
    '''
    
    return None

 

3:缺失值处理

from sklearn.preprocessing import MinMaxScaler,StandardScaler,Imputer
def im_extract():
    '''
    缺失值处理
    '''
    a = [[np.nan,2,10,40],[88,4,15,45],[75,3,13,np.nan]]

    cv = Imputer(smissing_values="NaN", strategy="mean",axis=0, verbose=0, copy=True)    #  将缺失值填充为mean
    data = cv.fit_transform(a)
    print(data)

4:PCA 降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

from sklearn.decomposition import PCA
def pca_extract():
    #  降维
    a = [[88, 2, 10, 40], [88, 4, 15, 45], [75, 3, 13,50]]

    cv = PCA(n_components=None)
    data = cv.fit_transform(a)
    print(data)

 

5:特征选择

 

from sklearn.feature_selection import VarianceThreshold
def vt_func():
    """"
    特征选择,删除低方差特征
    """
    x = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    std = StandardScaler()
    vt = VarianceThreshold(threshold=(.8 * (1 - .8)))   # 移除那些超过80%的数据都为1或0的特征
    data = vt.fit_transform(x)
    print(data)
    '''
        [[0 1]
         [1 0]
         [0 0]
         [1 1]
         [1 0]
         [1 1]]
    '''

    return None

 

<三> 算法评估器

1:k-近邻算法

欧式公式:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris,fetch_20newsgroups
def K_iris():
    """
    K 近邻 预测花种类
    :return:
    """
    ir = load_iris()
    # 1 切割数据集
    x_train,x_test,y_train,y_test =train_test_split(ir.data,ir.target,test_size=0.25)

    # 2 对数据标准化处理
    std = StandardScaler()
    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 算法评估器
    kn = KNeighborsClassifier()
    kn.fit(x_train,y_train)   #  开始训练数据

    y_predict  = kn.predict(x_test)
    print(y_predict)              #  [0 1 1 1 0 0 0 2 2 2 1 2 0 0 1 2 2 2 0 2 1 1 2 1 0 1 1 0 1 2 1 1 0 0 0 1 22]
    print('准确率:',kn.score(x_test,y_test))   #  0.9473684210526315

    return None

 

2:朴素贝叶斯

计算出数据属于各个目标值的概率,得出最大概率即对应样本属于该目标值类别。

注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别

from sklearn.datasets import load_iris,fetch_20newsgroups,load_boston
from sklearn.naive_bayes import MultinomialNB

def naive_bayes():
    """
    朴树贝叶斯算法实现新闻分类
    :return:
    """
    #  获取数据集
    news = fetch_20newsgroups()
    print(len(news.data))
    # 切割数据集
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25)
    # 特征化出处理
    ss = StandardScaler()
    ss.fit_transform(x_train)
    ss.transform(x_test)
    # 算法实现
    nb = MultinomialNB()
    nb.fit(x_train,y_train)
    y_predict = nb.predict(x_test)
    score = nb.score(x_test,y_test)
    print()

    return None

 

3:决策树

划分依据:信息增益,信息增益最大的特征值是最有特征

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差。

from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier

def decision_tree():
    """
    决策树
    :return:
    """
    data = pd.read_csv('./data/taitan.csv')
    # #  对数据处理
    data['age'].fillna(data['age'].mean(),inplace=True)
    # # 切割数据数据集
    feature = data[['age','sex','pclass']]
    target = data['survived']
    x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.25)

    # 对特征值做z字典特征处理》》类别-》one_hot编码       : 特征中有类别的要做one_hot 编码
    dv = DictVectorizer(sparse=False)
    x_train = dv.fit_transform(x_train.to_dict(orient="records"))       #one_hot 编码
    x_test = dv.transform(x_test.to_dict(orient="records"))


    # 决策树
    dt = DecisionTreeClassifier()
    dt.fit(x_train,y_train)

    y_predict = dt.predict(x_test)
    print(dt.score(x_test,y_test))

 

4:随机森林

包含了多个决策树,

学习算法
根据下列算法而建造每棵树:
•用N来表示训练用例(样本)的个数,M表示特征数目。
•输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
•从N个训练用例(样本)中以有放回抽样一个样本,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier

def decision_tree():
    """
    决策树
    :return:
    """
    data = pd.read_csv('./data/taitan.csv')
    # #  对数据处理
    data['age'].fillna(data['age'].mean(),inplace=True)
    # # 切割数据数据集
    feature = data[['age','sex','pclass']]
    target = data['survived']
    x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.25)

    # 对特征值做z字典特征处理》》类别-》one_hot编码       : 特征中有类别的要做one_hot 编码
    dv = DictVectorizer(sparse=False)
    x_train = dv.fit_transform(x_train.to_dict(orient="records"))       #one_hot 编码
    x_test = dv.transform(x_test.to_dict(orient="records"))


    # 决策树
    dt = DecisionTreeClassifier()
    dt.fit(x_train,y_train)

    y_predict = dt.predict(x_test)
    print(dt.score(x_test,y_test))

    # 随机森林
    rfc = RandomForestClassifier()
    rfc.fit(x_train, y_train)  # 开始训练数据

    y_predict = rfc.predict(x_test)
    print(y_predict)
    print('随机森林准确率:', rfc.score(x_test, y_test))

5:逻辑回归

解决二分类的利器

from sklearn.linear_model import LogisticRegression
def logistic():
    """
    逻辑回归:预测癌症
    :return:
    """
    #  获取数据集和整理数据集
    column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
              'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli',
              'Mitoses', 'Class']

    data = pd.read_csv('./data/cancer.csv',names=column)

    #  原数据中有 ? 值 要做替换
    data = data.replace(to_replace='?',value=np.nan)
    data = data.dropna()

    data_train = data[column[1:10]]
    data_target = data[column[10]]

    # 切割数据集
    x_train, x_test, y_train, y_test = train_test_split(data_train, data_target, test_size=0.25)
    # 特征处理
    ss = StandardScaler()
    ss.fit_transform(x_train)
    ss.transform(x_test)
    # 逻辑回归算法
    lg = LogisticRegression()
    lg.fit(x_train,y_train)
    print(lg.score(x_test,y_test))
    print(lg.coef_)
    cf = classification_report(y_test,lg.predict(x_test), labels=[2, 4], target_names=["良性", "恶性"])
    print(cf)

    return None

 

6:线性回归和岭回归

线性回归原理:y =  matmul(x,w) + bias  

def linear():
    """
    正规方程和梯度下降预测波士顿房价
    :return: None
    """
    # 获取波士顿数据集
    lb = load_boston()

    # 切割数据集
    x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)

    #  特征值和目标值都做 标准化特征处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))     #  sklearn 中  必须将一维矩阵转化为二维
    y_test = std_y.transform(y_test.reshape(-1, 1))

    # 正规方程实现   :
    lr = LinearRegression()
    lr.fit(x_train,y_train)
    print('正规方程',lr.coef_)
    print('正规方程',lr.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre = std_y.inverse_transform(lr.predict(x_test))
    ms = mean_squared_error(y_true,y_pre)
    print('正规方程均方差评价:',ms)

    # 梯度下降
    sgd = SGDRegressor()
    sgd.fit(x_train,y_train)
    print('梯度下降',sgd.coef_)
    print('梯度下降',sgd.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre1 = std_y.inverse_transform(sgd.predict(x_test))
    ms1 = mean_squared_error(y_true,y_pre1)
    print('梯度下降均方差评价:',ms1)

    # 岭回归
    rd = Ridge()
    rd.fit(x_train,y_train)
    print('岭回归',rd.coef_)
    print('岭回归',rd.score(x_test,y_test))
    y_true = std_y.inverse_transform(y_test)
    y_pre_r = std_y.inverse_transform(rd.predict(x_test))
    ms1 = mean_squared_error(y_true,y_pre_r)
    print('岭回归均方差评价:',ms1)
    
    return None

 

转载于:https://www.cnblogs.com/shikaishikai/p/11383067.html

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_30477293/article/details/102175966
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 10:42:42
  • 阅读 ( 1034 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢