机器学习总结

# encoding=utf8
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits, fetch_20newsgroups, make_blobs
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LinearRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd

#回归模型,用来预测
from sklearn.tree import DecisionTreeClassifier


def price_predict():
    #http://scikit-learn.org/stable/modules/linear_model.html
    #数据有三个特征:距离地铁距离、附近小学数量、小区绿化率
    # P =  W1 * A + W2*B + W3 *C
    X = np.array([[500.0, 3.0, 0.3], [1000.0, 1.0, 0.6],
                  [750.0, 2.0, 0.3], [600.0, 5.0, 0.2], [1200.0, 1.0, 0.6]])
    #具有三个特征的房屋对应的房价
    Y = np.array([10000., 9000., 8000., 12000., 8500.])

    #将数据转化到均值是0,方差是1的标准分布内
    std_x = StandardScaler()
    x_train = std_x.fit_transform(X)

    std_y = StandardScaler()
    y_train = std_y.fit_transform(Y.reshape(-1,1))

    #构建线性预测模型
    lr = LinearRegression()
    #模型在历史数据上进行训练,Y.reshape(-1,1)将Y变为二维数组,fit函数要求二维数组
    lr.fit(x_train,y_train)
    #使用训练模型预测新房屋[1300,3.0,0.4]的价格

    x_predict = std_x.transform(np.array([[1300,3.0,0.4]]))
    print(std_y.inverse_transform(lr.predict(x_predict)))



#k近邻分类(k表示以最近的几个邻居作为分类的指标)
#kNN表示了物以类聚人以群居的基本思考方法,最近的k个邻居是什么类别,预测样本就会被化为该类别
def knn_predict_rev(point):
    #http://scikit-learn.org/stable/modules/neighbors.html
    #数据理解为二维坐标上的6个点
    X = np.array([[1.0, 1.0], [1, 1.5], [0.5, 1.5],[3.0, 3.0], [3.0, 3.5], [2.8, 3.1]])
    #6个点的类别,按顺序和X依次对应,[1.0,1.0]的类别是0,依次类推
    Y = np.array([0,0,0,1,1,1])

    #n_neighbors就是kNN中的k
    knn = KNeighborsClassifier(n_neighbors=3)
    knn.fit(X,Y)
    print(knn.predict(np.array([[2.0,3.0]])))


def decide_play():
    #ID3
    """
    #http://scikit-learn.org/stable/modules/tree.html
    什么是Gini?
    dtree.csv样例数据:
    Outlook,Temperatur,Humidity,Windy,PlayGolf
    sunny,85,85,FALSE,no
    sunny,80,90,TRUE,no
    overcast,83,86,FALSE,yes
    rainy,70,96,FALSE,yes
    ......
    :return:
    """
    df = pd.read_csv('dtree.csv')
    #将数据转换为字典格式,orient="record"参数指定数据格式为{column:value}的形式
    #第一行数据为{Outlook:'sunny',Temperatur:85,Humidity:85,Windy:False,PlayGolf:no}
    #一个字典对应一行数据
    dict_train  = df.loc[:,['Outlook','Temperatur','Humidity','Windy']].to_dict(orient="record")
    #如果pandas从DataFrame取出一列数据,该数据类型会变为Series
    dict_target = pd.DataFrame(df['PlayGolf'],columns=['PlayGolf']).to_dict(orient="record")
    #训练数据字典向量化
    dv_train = DictVectorizer(sparse=False)
    x_train = dv_train.fit_transform(dict_train)

    #目标数据字典向量化
    dv_target = DictVectorizer(sparse=False)
    y_target = dv_target.fit_transform(dict_target)


    #创建训练模型并训练
    d_tree = DecisionTreeClassifier()
    d_tree.fit(x_train,y_target)

    data_predict = {'Humidity': 85,
      'Outlook': 'sunny',
      'Temperatur': 85,
      'Windy': False}

    x_data = dv_train.transform(data_predict)
    print dv_target.inverse_transform(d_tree.predict(x_data))

def article_category():
    #http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes
    """
    使用朴素贝叶斯,根据关键词对文章内容进行分类
    20newsgroups中的数据形式:
    ['文章1','文章2',........,'文章n']
    整体是一个数组,文章n代表一段文字
    :return:
    """
    #加载20newsgroups数据源,里面是主要英文报刊杂志的文章整理
    #categories指明要加载的文章类别,subset指明要加载训练集
    categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
    twenty_train = fetch_20newsgroups(subset='train',categories=categories)

    #计算所有文章的TFIDF
    tfidf_transformer = TfidfVectorizer()
    X_train_tfidf = tfidf_transformer.fit_transform(twenty_train.data)
    #构建多项式朴素贝叶斯模型
    clf = MultinomialNB(alpha=1.0).fit(X_train_tfidf, twenty_train.target)
    #需要判断类别的两篇文章
    docs_new = ['Chemical reaction', 'Intel CPU is good']
    #将要判断的文章向量花
    X_new_tfidf = tfidf_transformer.transform(docs_new)
    #进行预测
    predicted = clf.predict(X_new_tfidf)
    #zip 将数组a[1,2,3] b['a','b','c']变为[(1,'a'),(2,'b'),(3,'c')]
    for doc, category in zip(docs_new, predicted):
        print('%r => %s' % (doc, twenty_train.target_names[category]))


from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt
#支持向量机:找到分类界面,使支持向量间的间隔最大,支持向量到分割界面的距离最小
#支持向量是通过到分割界面距离最小的点的向量,且两向量间的距离最大
def hw_recognition():
    #http://scikit-learn.org/stable/modules/svm.html
    digits = load_digits()
    #random_state 设置随机种子
    X_train, X_test, Y_train, Y_test = train_test_split(digits.data, digits.target,
                                                        test_size=0.25, random_state=23)
    ss = StandardScaler()
    #fit是实例方法,必须由实例调用
    X_train = ss.fit_transform(X_train)
    X_test = ss.transform(X_test)

    lsvc = LinearSVC()
    lsvc.fit(X_train, Y_train)

    #Y_predict = lsvc.predict(np.array([digits.data[220]]))
    #plt.imshow(digits.images[220])
    #print Y_predict
    #plt.show()
    Y_predict = lsvc.predict(X_test)
    #生成评估报告:
    #precision(精确率) = 正正/(正正+反正)
    #recall(召回率,覆盖率)    = 正正/(正正+正反)
    #按照行解释正反: 正正:真正的正例预测为正例,正反:真正的正例预测为反例,反正:真正的反例预测为正例,
    #反反:真正的反例预测为反例
    print classification_report(Y_test, Y_predict, target_names=digits.target_names.astype(str))



def kmeans_plot():
    """
    #http://scikit-learn.org/stable/modules/clustering.html
    kmeans算法的过程:(假如有两类)
    1.随机选择两个点作为聚类的中心
    2.计算所有点距离两个中心的距离,选择距离较近的点作为类别。(例如:距离蓝点近,类别是蓝色)
    3.计算已经分好类的各组数据的平均值,使用各组数据的平均值中心作为新的中心
    4.以新的中心为依据,跳转到第2步
    5.直到收敛(两次迭代的数值没有明显的变化:新中心点距离上一次计算中心点的距离小于某个阈值,例如:0.03)

    """
    plt.figure(figsize=(6, 3))

    n_samples = 1500
    random_state = 170
    X, y = make_blobs(n_samples=n_samples, random_state=random_state)
    y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)

    plt.subplot(121)
    plt.scatter(X[:, 0], X[:, 1], c=y_pred)

    plt.subplot(122)
    plt.scatter(X[:, 0], X[:, 1], c=y)


hw_recognition()

"""
A,B表明两个工作地点的收益,A一个小时50$,B一个小时100$
W1,W2是两地工作时间,称为:权重,机器学习中要调整的系数,[W1,W2]构成一个二维搜索空间
T = W1 * A + W2 * B 是我们的评估函数
TMax = 650 是期望目标,也是我们的学习目标
每天工作8小时,每地至少工作一小时,这是学习约束

delta = |T - TMax| 绝对值是我们的评估函数,损失函数(cost,loss)
delta达到什么结果搜索结束,由算法来设计,例如delta=1 搜索结束(搜索结束也称为函数收敛)

在搜索空间中尝试搜索过程中,对W1、W2改变的幅度称为学习率
"""
原文地址:https://www.cnblogs.com/liangliangzz/p/10299518.html