美文网首页
Python Machine Learning

Python Machine Learning

作者: SnC_ | 来源:发表于2019-01-28 14:07 被阅读0次

    //机器学习笔记

    机器学习主要分为4大类:

    1. Classification : 如区分猫狗,趋向于分类
    2. Regression : 如预测股票价格,趋向于数字量化
    3. Cluster Analysis : 将相似数据放到一起
    4. Association Analysis : 尝试发现不同事物间的联系

    Classification 和 Regression 是带有明确目的的研究。属于supervised
    Cluster Analysis 和Association Analysis 属于无明确目的的探索性研究。属于unsupervised

    术语terms

    • sample, example, row, instance, record, observation 都表示数据集中的一个例子。
    • variable, column, field, attribute, feature, dimension 都表示数据集中的一个属性。

    Classification

    主要有3种研究方法:

    • KNN
    • Naive Bayes
    • Decision Tree : 从一总数据集开始,每一层加入判断条件,划分子集。最终得到最符合目标的子集。

    training phase : training data + model . 主要目的是调整model中的参数,以达到相对小的错误率。
    testing phase : testing data + trained model . 主要目的是检测model的工作性能。

    #用天气监测数据,结合机器学习中的decision tree建立一个能根据早上9点的数据预测下午3点是否下雨的model.
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import accuracy.score
    
    data = pd.read_csv('daily_weather.csv') #读取数据
    
    #data cleaning
    del data['number'] #删除不需要的列
    data = data.dropna() #删除空值
    
    #准备数据
    clean_data = data.copy()
    clean_data['high_humidity_lable'] = (clean_data['relative_humidity_3pm']>24.99)*1
    #以湿度大于24.99作为下雨的标准,以此作为机器学习的lable,即下面的y
    y = clean_data[['high_humidity_lable']].copy() #注意这里的双层中括号. 单层会导致y为Series而非DataFrame
    morning_features = ['air_pressure_9am','air_temp_9am','avg_wind_direction_9am','avg_wind_speed_9am',
            'max_wind_direction_9am','max_wind_speed_9am','rain_accumulation_9am',
            'rain_duration_9am'] #取出所有与早9点的天气数据有关的列
    x = clean_data[morning_features].copy() #x作为original data set
    
    #training phase
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=324) 
    #0.33表示保留33%的数据,留着作为testing data。其他数据作为training data
    #324作为random number generator的seed。该参数可变,不同参数会导致最后不同的预测准确度。
    humidity_classifier = DecisionTreeClassifier(max_leaf_nodes=10, random_state=0)
    #max_leaf_nodes设为10作为决策树划分结果的严格程度。过高或过低都不太好。 不设值将默认设为无穷。
    #random_state作用同上。
    humidity_classifier.fit(x_train, y_train) #通过training 得到model
    
    #testing phase
    predictions = humidity_classifier.predict(x_test)
    
    #验证结果准确率
    accuracy_score(y_ture = y_test, y_pred = predictions)
    

    Cluster Analysis

    将互相相似的sample划分到同一个group/cluster中。

    几种距离计算方式:

    • Euclidean Distance :即两点之间直线最短
    • Manhattan Distance :垂直距离+水平距离
    • Cosine Similarity : 不同点与基点所成cos角度的差距

    cluster analysis 属于unsupervised,这样的分析没有准确的目标,没有最正确的结果,没有lable。

    K-means

    centroid : center of a cluster
    WSSE : (within-cluster sum of squared error)。 error即cluster中的sample与centroid的距离,squared error 即距离平方。所有点的squared error之和即WSSE。

    K-Means建立model的大概步骤:

    1. 给出k个原始centroid
    2. 将sample分配给与它最接近的centroid (涉及到计算距离)
    3. 调整centroid位置,随之调整sample分配情况
    4. repeat,直到达到自设标准

    最终的cluster分类结果与原始的k的设置有较大关系。如何确定K的数量应设为几?
    以下有几种k的数量确定方式:

    1. Visualization : 将数据集画一张图,观察数据是否有天然的能观察到的聚集情况。
    2. Application-dependent : 此方式更多地依赖于分析师自身对于研究课题的熟悉程度。比如研究客户喜欢购买什么样的商品时,对于选取哪些商品类别应有自己的打算。 研究地理情况的人员,对于自己想要研究的地点应心中有数。
    3. Elbow Method : 画出k的数量(横轴)与WSSE(纵轴) 的折线图,选取下落最明显的位置(肘部),作为K的数量。

    如何确定何时该停止?

    1. 当改变centroid位置不再导致cluster的内容变化时。
    2. 当改变centroid位置时,更换cluster的sample数目低于某个阀值。
    # csv file download link : https://drive.google.com/open?id=0B8iiZ7pSaSFZb3ItQ1l4LWRMTjg
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from sklearn.preprocessing import StandardScalar
    from sklearn.cluster import KMeans
    from itertools import cycle, islice
    from pandas.plotting import parallel_coordinates
    
    #拿到数据,先熟悉内容,删去无效数据。这是后续分析的基础。
    data = pd.read_csv('minute_weather.csv')
    sample = data[(data['rowID']%10) == 0] #由于数据较大,每10个采样一次。
    sample.describe().transpose() #describe()方式是直观感受数据的好途径。
    del sample['rain_accumulation']
    del sample['rain_duration'] #通过观察发现这两列大部分值为0,将其删去
    
    #准备分析的内容
    features = ['air_pressure', 'air_temp', 'avg_wind_direction', 'avg_wind_speed', 
    'max_wind_direction',  'max_wind_speed','relative_humidity']
    select = sample[features]
    
    #开始建立model,并分析
    X = StandardScaler.fit_transform(select) #对特征进行标准化/特征缩放
    kmeans = KMeans(n_clusters=12)
    model = kmeans.fit(X) #分析生成center
    centers = model.cluster_centers_ #12个cluster共12组,每组7个feature对应7个center
    
    #显示结果
    def pd_centers(featureUsed, centers): #add a column "number" for each cluster
        colNames = list(featuresUsed)
        colNames.append('prediction')
        Z = np.append[(A,index) for index, A in enumerate(centers)]
        P = pd.DataFrame(Z, columns = colNames)
        P['prediction'] = P['prediction'].astype('int')
        return P
    
    def parallel_plot(data): #create parallel plots 
        my_color = list(islice(cycle(['b','r','g','y','k']), None, len(data)))
        plt.figure(figsize=(15, 8)).gca().axes.set_ylim([-3,+3])
        parallel_coordinates(data, 'prediction', color=my_colors, marker='o')
    
    P = pd_centers(features, centers)
    #下面绘图的参数按照自己想研究的内容来即可
    parallel_plot( P[P['relative_humidity']<-0.5] ) #干燥天气
    parallel_plot( P[P['air_temp']>0.5] ) #较暖天气
    

    Regression

    Linear Regression -- Least Square Method (LSM)

    LSM的目标:画一张坐标图,根据样本点,找到一条regression line,使其后续的预测值与真实值的square error之和最小。 (此处error为同一横坐标下的垂直距离)

    Linear Regression的目标:致力于寻找输入与输出之间的线性关系,用LSM方法找到最适合样本集的regression line。

    • RMSE(Root Mean Squared Error):该值越小,说明regression line取得越好。
    # 根据球员各方面的属性指标,预测其价值得分
    # file link : https://www.kaggle.com/hugomathien/soccer
    import sqlite3
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    from math import sqrt
    from sklearn.metrics import mean_squared_error
    
    #读取数据
    db = sqlite3.connect('database.sqlite')
    df = pd.read_sql_query("select * from Player_Attributes", db)
    
    #熟悉数据,选择要分析的部分,清洗数据
    df.columns
    features = [
           'potential', 'crossing', 'finishing', 'heading_accuracy',
           'short_passing', 'volleys', 'dribbling', 'curve', 'free_kick_accuracy',
           'long_passing', 'ball_control', 'acceleration', 'sprint_speed',
           'agility', 'reactions', 'balance', 'shot_power', 'jumping', 'stamina',
           'strength', 'long_shots', 'aggression', 'interceptions', 'positioning',
           'vision', 'penalties', 'marking', 'standing_tackle', 'sliding_tackle',
           'gk_diving', 'gk_handling', 'gk_kicking', 'gk_positioning',
           'gk_reflexes'] #作为输入的特征
    target = ['overall_rating'] #作为输出的特征
    df = df.dropna()
    
    # 开始建立training data set,testing data set (同Classification)
    X = df[features]
    Y = df[target]
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.33, random_state = 324) 
    #参数的意义同Classification
    
    #建立linear regression model -- training phase
    regressor = LinearRegression()
    regressor.fit(X_train, Y_train)
    
    #建立linear regression model -- testing phase
    Y_prediction = regressor.predict(X_test)
    
    #验证结果准确率
    RMSE = sqrt(mean_squared_error(y_true = Y_test, y_pred = Y_prediction))
    
    

    相关文章

      网友评论

          本文标题:Python Machine Learning

          本文链接:https://www.haomeiwen.com/subject/villdqtx.html