大数据分析与挖掘
¶

04. How to do grid search in PySpark and Classification in PySpark
¶

主讲人:丁平尖
In [0]:
# pyspark读取数据
# inferSchema=True:自动推断schema
# header=True:读取数据时,将第一行作为表头
# mode='DROPMALFORMED':将不符合schema的行删除
df = spark.read.csv('/Volumes/workspace/usahousing/usahousing/USA_Housing.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
Avg. Area IncomeAvg. Area House AgeAvg. Area Number of RoomsAvg. Area Number of BedroomsArea PopulationPriceAddress
79545.458574316785.6828613216155877.0091881427922374.0923086.8005026864561059033.5578701235208 Michael Ferry Apt. 674
79248.642454825686.00289980827524256.7308210190949193.0940173.072173644821505890.91484695188 Johnson Views Suite 079
In [0]:
# 将DataFrame的column name进行标准化处理
# 我们将空格、短横线和斜线替换成下划线
# 只保留字母、数字和下划线
def sanitize_column_name(name):
    """Drops unwanted characters from column names.
    We replace spaces, dashes and slashes with underscores.
    and only keep alphanumeric characters.
    """
    answer = name
    for i, j in ((" ", "_"), ("-", "_"), ("/", "_"), ("&", "and")):
        answer = answer.replace(i, j)
    return "".join([
        char 
        for char in answer 
        if char.isalpha() or char.isdigit() or char == "_"])
# df.toDF(): 返回一个列名已更新的新 DataFrame
df = df.toDF(*[sanitize_column_name(col) for col in df.columns])
In [0]:
# 将Avg_Area_Income和Avg_Area_House_Age两列从string类型转换为double类型
from pyspark.sql.types import DoubleType
df = df.withColumn("Avg_Area_Income", df["Avg_Area_Income"].cast(DoubleType()))
df = df.withColumn("Avg_Area_House_Age", df["Avg_Area_House_Age"].cast(DoubleType()))
df.printSchema()
root
 |-- Avg_Area_Income: double (nullable = true)
 |-- Avg_Area_House_Age: double (nullable = true)
 |-- Avg_Area_Number_of_Rooms: double (nullable = true)
 |-- Avg_Area_Number_of_Bedrooms: double (nullable = true)
 |-- Area_Population: double (nullable = true)
 |-- Price: double (nullable = true)
 |-- Address: string (nullable = true)

In [0]:
# 清洗数据
df = df.dropna()
USAhousing = df
from pyspark.ml.feature import RFormula
from pyspark.ml.regression import LinearRegression
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml import Pipeline, Model
In [0]:
# 将数据分成训练数据和测试数据
# train_data 和 test_data 分别占总数据的 60% 和 40%
train_data, test_data = df.randomSplit([0.6, 0.4], 24)
x_cols = list(set(USAhousing.columns) - {'Price', 'Address'})
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("formula: {}".format(formula))
# RFormula will automatically assemble the columns into a vector.
pipeline = Pipeline(
    stages=[
        RFormula(formula=formula, featuresCol='features'),
        LinearRegression(labelCol='Price')
    ]
)
fitted_model = pipeline.fit(train_data)
fitted_model
formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
Downloading artifacts:   0%|          | 0/55 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
Out[0]:
PipelineModel_a2622311ac77
In [0]:
# 使用训练好的模型对测试数据进行预测
d = fitted_model.transform(test_data)
display(d.limit(2))
Avg_Area_IncomeAvg_Area_House_AgeAvg_Area_Number_of_RoomsAvg_Area_Number_of_BedroomsArea_PopulationPriceAddressfeatureslabelprediction
35454.7146594754456.8557083639011076.0186465026796084.559636.402553024991077805.577726322Unit 4700 Box 1880 Map(vectorType -> dense, length -> 5, values -> List(4.5, 35454.714659475445, 6.018646502679608, 59636.40255302499, 6.855708363901107))1077805.577726322905856.8198512727
35797.3231215482455.5442210466344327.7951382418041515.024844.200190072384299863.0401311839645 Mary Radial Map(vectorType -> dense, length -> 5, values -> List(5.0, 35797.323121548245, 7.795138241804151, 24844.200190072384, 5.544221046634432))299863.0401311839382459.18199658114
In [0]:
# 从pipeline中检索拟合好的模型
lm = fitted_model.stages[-1]
# model coefficient, intercept
print("Coefficients: {}".format(lm.coefficients))
print("Intercept: {}".format(lm.intercept))
print(f"R^2 fit metric {lm.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122]
Intercept: -2629038.655070738
R^2 fit metric 0.916680702340295
In [0]:
# 线性回归模型,使用交叉验证进行网格搜索
# 定义RFormula公式,用于将Price作为标签列,其他列作为特征列
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("formula: {}".format(formula))
rformula = RFormula(formula=formula)
lr = LinearRegression(labelCol = 'Price')
pipeline = Pipeline(stages=[rformula, lr])
formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
In [0]:
from pyspark.ml.tuning import ParamGridBuilder
# Define parameter grid
# 在params中有三个参数组合,分别是alpha=0.0, alpha=0.5, alpha=1.0
# LinearRegression 线性回归模型
params = ParamGridBuilder() \
    .addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]) \
    .build()
# 创建一个回归评估器,用于评估模型在测试数据上的性能
evaluator = RegressionEvaluator() \
    .setMetricName("r2") \
    .setPredictionCol("prediction") \
    .setLabelCol("label")
In [0]:
from pyspark.ml.tuning import CrossValidator

# Run CrossValidator (no data folds)
# 创建一个交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成3个折叠,每个折叠用于一次训练和一次测试
cv = CrossValidator() \
    .setEstimator(pipeline) \
    .setEvaluator(evaluator) \
    .setEstimatorParamMaps(params)

fitted_grid = cv.fit(train_data)
Downloading artifacts:   0%|          | 0/85 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
Downloading artifacts:   0%|          | 0/55 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
In [0]:
import numpy as np
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量
num_models = len(fitted_grid.getEstimatorParamMaps())
# 打印模型的数量
print("Number of models in fitted grid: {}".format(num_models))
# 打印模型评估指标的平均值
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3
Model metrics are: [0.9161690215115436, 0.9161690215115436, 0.9161690215115436]
In [0]:
# 简单模型总结
# 从拟合好的网格中获取最佳模型
# fitted_grid.bestModel 返回的是一个 PipelineModel 对象,
# 它包含了最佳的 RFormula 模型和线性回归模型
# fitted_grid.bestModel.stages 返回的是一个列表,包含了 Pipeline 中的所有模型
# fitted_grid.bestModel.stages[1] 返回的是 Pipeline 中的第二个模型,也就是线性回归模型
model = fitted_grid.bestModel.stages[1]

print("Coefficients: {}".format(model.coefficients))
print("Intercept: {}".format(model.intercept))
print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122]
Intercept: -2629038.655070738
R^2 fit metric 0.916680702340295
## 使用 k 折交叉验证进行网格搜索
- 与上述相同,但在数据的 k 个子集上进行测试
- CrossValidator 计算通过在 k 个不同的数据集对上拟合 Estimator 而产生的 k 个模型的平均评估指标
- 最后,它使用最佳参数和整个数据集重新拟合 Estimator(管道)
In [0]:
# Run CrossValidator (k=3)
# 创建一个交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成3个折叠,每个折叠用于一次训练和一次测试

number_of_folders = 3
cv = CrossValidator() \
    .setEstimator(pipeline) \
    .setEvaluator(evaluator) \
    .setEstimatorParamMaps(params) \
    .setNumFolds(number_of_folders)

fitted_grid = cv.fit(train_data)
Downloading artifacts:   0%|          | 0/85 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
Downloading artifacts:   0%|          | 0/55 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
In [0]:
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量

import numpy as np
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3
Model metrics are: [0.9161690215115436, 0.9161690215115436, 0.9161690215115436]
In [0]:
# summary of regression model
model = fitted_grid.bestModel.stages[1]

print("Coefficients: {}".format(model.coefficients))
print("Intercept: {}".format(model.intercept))
print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.606677232051,21.502388556887606,120617.74657879196,15.23501171427518,164683.75900259122]
Intercept: -2629038.655070738
R^2 fit metric 0.916680702340295
In [0]:
# 交叉验证器,用于选择最佳模型
# 交叉验证器将数据集分成训练集和测试集,并在训练集上训练模型,然后在测试集上评估模型的性能
# 交叉验证器会尝试所有可能的参数组合,并选择在测试集上性能最好的参数组合
# 交叉验证器使用r2作为评估指标
# 这里将数据集分成6个折叠,每个折叠用于一次训练和一次测试
number_of_folders = 6
cv = CrossValidator() \
    .setEstimator(pipeline) \
    .setEvaluator(evaluator) \
    .setEstimatorParamMaps(params) \
    .setNumFolds(number_of_folders)

fitted_grid = cv.fit(train_data)
Downloading artifacts:   0%|          | 0/85 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
Downloading artifacts:   0%|          | 0/55 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
In [0]:
import numpy as np
# 获取拟合网格中模型的数量
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 3
Model metrics are: [0.916199039014269, 0.916199039014269, 0.916199039014269]
In [0]:
# Cross validate with multiple models
from pyspark.ml.feature import RFormula
from pyspark.ml.regression import LinearRegression, DecisionTreeRegressor, GeneralizedLinearRegression, GeneralizedLinearRegressionModel
from pyspark.ml import Pipeline, Model
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
In [0]:
# 交叉验证多个模型
# 指定模型、它们的参数和通用管道
# 通用管道对象
formula = "{} ~ {}".format("Price", " + ".join(x_cols))
print("Formula: {}".format(formula))
r_formula = RFormula(formula=formula)
pipeline = Pipeline(stages=[])
basePipeline = [rformula]
param_grid = []

lr = LinearRegression()
param_grid += ParamGridBuilder() \
    .baseOn({pipeline.stages: basePipeline + [lr]}) \
    .addGrid(lr.regParam, [0.1, 0.3, 0.8]) \
    .build()

dt = DecisionTreeRegressor()
param_grid += ParamGridBuilder() \
    .baseOn({pipeline.stages: basePipeline + [dt]}) \
    .addGrid(dt.minInstancesPerNode, [1, 5]) \
    .build()

glr = GeneralizedLinearRegression()
param_grid += ParamGridBuilder() \
    .baseOn({pipeline.stages: basePipeline + [glr]}) \
    .addGrid(glr.regParam, [0, 0.8]) \
    .build()
param_grid
Formula: Price ~ Avg_Area_Number_of_Bedrooms + Avg_Area_Income + Avg_Area_Number_of_Rooms + Area_Population + Avg_Area_House_Age
Out[0]:
[{Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   LinearRegression_08c1a4c12b7f],
  Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.1},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   LinearRegression_08c1a4c12b7f],
  Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.3},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   LinearRegression_08c1a4c12b7f],
  Param(parent='LinearRegression_08c1a4c12b7f', name='regParam', doc='regularization parameter (>= 0).'): 0.8},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   DecisionTreeRegressor_efd8fdf43c37],
  Param(parent='DecisionTreeRegressor_efd8fdf43c37', name='minInstancesPerNode', doc='Minimum number of instances each child must have after split. If a split causes the left or right child to have fewer than minInstancesPerNode, the split will be discarded as invalid. Should be >= 1.'): 1},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   DecisionTreeRegressor_efd8fdf43c37],
  Param(parent='DecisionTreeRegressor_efd8fdf43c37', name='minInstancesPerNode', doc='Minimum number of instances each child must have after split. If a split causes the left or right child to have fewer than minInstancesPerNode, the split will be discarded as invalid. Should be >= 1.'): 5},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   GeneralizedLinearRegression_8db3068d3f46],
  Param(parent='GeneralizedLinearRegression_8db3068d3f46', name='regParam', doc='regularization parameter (>= 0).'): 0.0},
 {Param(parent='Pipeline_2034d933a6a9', name='stages', doc='a list of pipeline stages'): [RFormula_8806986a86ec,
   GeneralizedLinearRegression_8db3068d3f46],
  Param(parent='GeneralizedLinearRegression_8db3068d3f46', name='regParam', doc='regularization parameter (>= 0).'): 0.8}]
In [0]:
# Specify the common (regression) model evaluator
evaluator = RegressionEvaluator() \
    .setMetricName("r2") \
    .setLabelCol("label") \
    .setPredictionCol("prediction")

# run crossvalidator (k=3)
number_of_folders = 3
cv = CrossValidator() \
    .setEstimator(pipeline) \
    .setEvaluator(evaluator) \
    .setEstimatorParamMaps(param_grid) \
    .setNumFolds(number_of_folders)

fitted_grid = cv.fit(train_data)
In [0]:
# 简单模型总结
# 导入 numpy 库,用于数值计算
# 获取拟合网格中模型的数量
import numpy as np
num_models = len(fitted_grid.getEstimatorParamMaps())
print("Number of models in fitted grid: {}".format(num_models))
print(f"Model metrics are: {fitted_grid.avgMetrics}")
Number of models in fitted grid: 7
Model metrics are: [0.9161690222133184, 0.9161690236163919, 0.916169027121294, 0.6519340361458211, 0.6529787791031572, 0.9161690215115436, 0.916169027121294]
In [0]:
import re
from pyspark.ml.tuning import CrossValidatorModel

def paramGrid_model_name(model):
    params = [v for v in model.values() if type(v) is not list]
    name = [v[-1] for v in model.values() if type(v) is list][0]
    name = re.match(r'([a-zA-Z]*)', str(name)).groups()[0]
    return f"{name}{params}"

def cv_metrics(cv: CrossValidatorModel):
    measures = zip(cv.avgMetrics, [paramGrid_model_name(m) for m in cv.getEstimatorParamMaps()])
    metrics, model_names = zip(*measures)
    return metrics, model_names

# 从拟合好的网格中获取所有模型的评估指标和名称
metrics, model_names = cv_metrics(fitted_grid)
metric_name = fitted_grid.getEvaluator().getMetricName()
In [0]:
# 模型指标比较图
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context("notebook")
sns.set_style('white')
sns.set_palette('bright')

def add_metric_labels(metrics):
    for i in range(len(metrics)):
        plt.text(i, metrics[i], f"{metrics[i]:.3f}", ha='center', va='bottom')

pdf = pd.DataFrame(zip(metrics, model_names), columns=['r2', 'model'])
sns.barplot(data=pdf, x='model', y='r2').set(title="Model Metrics")
plt.xticks(rotation=45)
add_metric_labels(metrics)
No description has been provided for this image
In [0]:
model = fitted_grid.bestModel.stages[1]

if isinstance(model, GeneralizedLinearRegressionModel):
    # 如果模型是广义线性回归模型,则直接打印模型的 summary(包含详细统计信息)
    print(model.summary)
else:
    # 否则,打印模型的系数、截距和 R^2 拟合优度
    print("Coefficients: {}".format(model.coefficients))
    print("Intercept: {}".format(model.intercept))
    print(f"R^2 fit metric {model.summary.r2}")
Coefficients: [1998.7406281513245,21.502338835170594,120617.38723836852,15.234976572111597,164683.38385046888]
Intercept: -2629029.7626482025
R^2 fit metric 0.9166807023352761
In [0]:
# 使用交叉验证选择的最佳模型对测试数据进行预测
# fitted_grid.bestModel 返回的是一个 PipelineModel 对象,
# 它包含了最佳的 RFormula 模型和线性回归模型
# 使用 fitted_grid.bestModel.transform() 方法对测试数据进行预测

predictions = fitted_grid.bestModel.transform(test_data)
display(predictions.select("label", "prediction"))
labelprediction
1077805.577726322905857.7217549165
299863.0401311839382461.210155827
599504.0192866956450579.3222529907
899609.3001428025760635.9607011373
723750.0652577134578777.0801798133
968411.6243946048842346.5123654515
401148.5687913792489702.4953861884
539483.3966111792498151.31364190625
529282.0843920948492255.5311492714
152071.87474956046224352.27808677126
798639.6541779223873972.9143344644
509499.588996669579349.8334724922
664465.3309873971665907.1230268287
560598.5384309639580069.651997698
494742.5435776913463103.0388433356
319495.66759175994475360.491742461
1073355.783703826997068.619075343
862865.8153196024792958.200356191
852703.2636757497899070.0560973356
1078016.93964910021125023.9679705012
1054606.9845532854904411.2984304121
809486.7099279496893943.1397758
747933.4869386142827518.5119610061
324981.9929926853483642.168372151
624482.7635866479714422.7040581186
786430.8996307264819072.0543287611
920540.6539499458930085.5051769968
1344406.93015855021207680.752889615
959625.5301771795931452.8310015076
497579.4465868728525086.5568316998
900851.1631095213929393.3493556743
852590.3528209794744039.8788878946
802048.4455314139845147.4308651472
541953.9056802422596619.4873849619
896944.24427116811040887.2171885697
923830.33486809698322.8158854521
615055.6757921792776798.7696506479
961354.2877278551045074.3039248711
1108406.7859168318934876.0998357511
867714.3838490517681711.3081251266
576356.0318820125493129.94786171755
300464.0986827323312124.34152681706
378466.4201839389547632.1298307637
792146.0760039431790228.1746332161
615144.898641351780055.4840218327
882057.1705928424794162.396794477
853750.6529487937840771.4808010673
864132.0330832003965117.2680421206
718874.679765292590243.0834978092
710269.2139681028753096.7071534749
885661.5908366481824418.953640359
456019.171216889559170.1139169754
774674.0566597179654671.5618288661
671661.7134409613560017.9706135257
566896.2123271407587742.1836591074
1012269.82010468921004116.6582593797
762144.9261238109772080.5335629471
646198.2245230615664362.5128415697
884015.2270688239929879.6386953611
970044.66564006921030501.8954870123
668183.5098529167511427.73730342556
1035125.85665119441179582.2568395184
1354973.55349512421333360.1148526021
589352.3954068222762491.6849481538
702321.7523214206753900.3389015459
963934.0130108644801014.3252757574
1082486.6792851271066608.5249923165
581200.0967346437639153.0061503984
1209445.22037353021131446.8035558308
1057838.49342253851174399.6424386865
617157.9102965128488265.17242421024
735952.1688894632762416.9764078693
753930.5825393641916792.2067041025
1244630.9976000021235688.640629136
585440.4314477128673038.3982542446
773996.476231782784032.660765125
573434.664234319775510.8889864814
725040.8959547429685907.583558362
1014513.20953143141070521.470774752
1211110.08408248631106671.585348918
549976.1455595789512372.6889687702
668255.4804327786500538.3052444868
967868.514560341004473.7569937278
542596.9895250229656947.2339569861
1080624.49716572071065323.0288580032
975384.18142201761098114.2562855007
927978.90924495841013437.5715308385
454055.65585268044423532.780682629
757943.2228205727806650.1209215429
283208.13218687923350231.27719695633
1389047.55777646651372889.8651169105
892039.40345226641063754.0460159942
1352096.05068029931386981.528655333
1218509.14532449261170952.1316619576
828127.0276465778916079.1975067635
497368.0367931192506068.2055761302
1168588.03132077261146209.316298122
940138.9613987308887025.2879198687
555811.4067429452757717.0622053631
873241.9885742475767567.4544518813
534305.1323349292611694.0504732188
390948.4499941545505978.50523186615
942093.92447739561053272.7712265807
1286477.39587790261059995.0194930504
612938.7144827124630277.6306834249
829128.6568381399685670.4187395177
743393.3473414255814257.8565637791
872595.0930335799907269.84581273
1107692.0033501994832720.9212871217
1131533.55540946131029238.6080153217
658644.6170003233521062.0157369999
211017.97049475575471654.6838751002
988123.75534001691122526.20332258
426100.4805486336510479.4742671605
913587.09744740441006205.7511925818
287307.583688923253871.5606247834
686644.610408734630843.7933544209
1220987.00207160931031510.6579631562
385678.1666731234396642.9738725908
774009.5475941251858028.8808309245
1170892.97965498941091689.5793701792
794075.861502829952849.4065394704
549167.9398554484702808.7846083236
945981.5296322837958436.6097235233
979568.6285412521034975.9098684839
1472539.9582662671420925.7818659572
817938.7774108642877767.6794343651
334485.1931043381259234.16985801235
1116193.2929662361312298.3327156934
1285923.7342119071339624.8877161788
832475.189015321789985.7378650042
1255202.10983879211148224.250500144
730739.4189500834727673.1220210101
1086072.07106142171030655.2645698893
1012262.7116594331871543.1656844746
1052185.17595339661138883.3386341566
961727.46838822775698.6364942654
674657.9106630747764184.8181887618
912585.62116924641076239.7035852442
876763.5840599823940088.8341164333
1107077.9129665751131643.175189137
404976.365896227474650.947982057
1154270.484916121113171.0826701121
527749.4038647808592336.4867481021
1137446.9933969631158918.2845669198
308199.89116387354433398.814344062
1128403.3660592271044166.7842295547
1371527.32701182411318752.924153661
658646.1847265189840612.3190000155
1253648.32436370061132991.634613406
907462.4512020181866238.5534919328
578309.0861866743772572.6192210969
1237224.85875181621186923.416254722
885796.2795967467926012.4968295544
479500.5568108269620795.765551345
728402.000075194824158.6177604385
685123.139313775552052.136398261
1186357.1790446651225759.6079171547
772310.2278261484784645.23498883
1174949.8607906751100680.298227685
1062666.36638358171073515.7309834664
1218635.8514065221041381.3600363615
847155.0413472857997106.2169049396
1176437.91898887441153651.7433665162
1112314.3029114071101176.0163470902
430088.25071462436561553.3870646958
1222887.12084180931259488.5434108004
1279945.51016801921381299.692210006
508951.5668799004548561.5145411962
685503.9902718081745698.6163431066
1411217.49285109341305546.933904416
524712.7660674525527833.2346843309
725830.6020326181837755.8958994704
945614.5659127636918821.5447417228
577168.2739439054865538.2741086544
1311432.3881116851180896.5358315124
553077.2126120757626677.5105835791
1451658.87724072441443978.2745617623
879356.366048286992165.0578733259
860346.470698685817745.0407394976
953261.9162022916843947.5973336874
266298.8811183604329817.0157609419
955689.53292585281116708.4427657882
1178600.64778511741046736.7059808038
1300389.35082021121252192.3210812863
628870.345640628486978.9714214979
679922.2521497933740883.2435666486
706135.1446389129544530.0286632134
1409943.3029948411302481.584925115
914378.3344281595770395.8882545596
1394900.9845835551411719.6071992265
814240.281598352877572.3053372898
768541.9161245954834722.6049724943
1372969.31074943021498539.485284763
1208843.27673077771230230.0296893823
1598736.40016478021439202.7344580335
1454681.93676710971284083.7358841007
803270.1278367852780735.4204821261
817377.3110222428763264.135277119
1094069.79812153871189095.2515460635
705444.1167909042856236.7796625295
1248130.52058786131140266.3632161557
911901.1553498644911243.2205115701
1355362.9555872611332517.4245235184
714822.5871702337794506.0809464143
1048135.7541761531993138.1140685049
1198725.48714490171353745.9259199873
1194083.24724985361222225.2843505084
831168.833673851777464.727341943
776125.597113738826329.4444072582
738030.6498645385790465.0727433525
1071279.2102445441234171.4429152175
288708.9121479006396597.1860731989
650939.2066718516690537.8699000962
1350283.99651666921388479.0373552833
1202452.72821149231053694.7427687282
734562.104533648789598.6549636987
840208.7430414602910398.9556439086
796389.4379566306714634.5464360099
1230097.4509450071236149.4998232843
583016.7918965971568479.8104038057
1090788.98123406531073766.7843816113
647982.6536393018840016.3521086122
624244.9443876417826289.3876212188
1042243.73127195241014066.5767430337
565937.200553177627982.5990957809
1130221.29762571261271423.4657237385
1155801.25298544161046074.7905298444
1366980.90988087631212800.621275377
675489.7526839289731765.5044331136
1099351.3538513971202167.8669258016
1466605.77379896841341034.076946531
1398979.24870824461327650.887157205
1318231.41828521041406671.2492875229
1193482.50309296461254826.7506954134
994517.0453351331158206.5006203316
1366988.23516816231421423.2859668555
1355022.2825666891352451.6699535367
1102641.11402327977867.1850368939
1200764.84420045161284660.981646486
693566.7572719983622540.3521056972
1051567.9457782458950606.3818102628
809057.4586058989725297.9107160578
1113647.8703720661079896.8575799926
903665.2036911576917849.2599850255
1247645.4097108131218305.7937994814
1308465.24004300961132160.979383185
781213.0669276181784928.3702196144
919963.0085832879919287.5270270007
1494241.22619043661561948.936967746
1262017.7920599471143820.071569886
714166.3978061128609839.8597315284
989263.23661234932343.3609821321
1120943.33859060451062352.9611648466
1034539.83061789921004748.6977966521
1143672.82541427581071110.8024588586
962551.03714019221050098.8783714017
1409762.11949030151485265.1539810044
1397564.15628244051397313.440508416
984311.774539692965426.7512445129
962501.9015215624852492.0817686445
854812.2579554294816319.6529729948
1269811.0891527031076608.2345124357
592512.4283228129762499.2093216144
748322.708245135852785.6901688152
1148749.93331185911180568.516965602
696467.1699379117538466.5253002322
1000216.8576741072949427.0099754459
790802.8010348069716810.3406128068
1290324.64861994981389713.6472274726
603714.7885821962681694.3263997477
729641.7408744311693054.6547133904
1048639.78949744651089662.7461104807
742858.6356339195824849.6604806851
1127637.55736660211033329.0482190135
1317160.40262293581129037.7861198764
866666.0553738795965766.6507591587
836235.0305323859771290.1962769628
774491.653288187749556.8553514802
1076334.1025455322928650.7519563674
1231452.18888375161288165.43610053
1146637.5438434811153936.9642678066
393639.07395721273564449.8282799674
1407291.8508141921631241.8361125411
834268.3429210644947639.8398207505
783565.1025001407748295.9434734383
1127082.19894176741035910.4457318326
1453974.50595087191471578.9286865164
1239309.91470995571170866.9870189163
828497.0670960692975022.8475220711
1208458.24630015481075987.3342275913
1278618.62031413541231247.0346587943
716771.0057488753898666.9588805651
886536.4283747243712951.6043452909
1233965.8373781241227144.293081014
1176655.08538131651089943.1107004392
1430051.08848789611233938.5592040215
646248.1833677717671645.715985043
1380715.31502395681270015.7534595523
1120894.80419417381108684.2513867365
852099.4640268538913942.4161475394
704375.8684056341755370.2408691444
1059431.45126335951015675.8757889867
1414286.72242412181350771.3180475193
934111.6355005292968428.3864539862
1061222.53686883651021769.3977436922
634218.4408284404536780.5152674424
1096938.4279098415969564.4339073487
759360.6547692231680127.4575254703
1591188.34848729381435911.5518007488
1046818.069758831058096.6592821437
1015233.0322629961091961.4673636546
1111360.30281169061085995.2959097656
1197069.264197741093732.8243221631
1285933.40840668231303156.4613554627
1189069.10469094081206940.5260432488
846052.911198368767900.2172392756
578593.5339451779677211.3355183769
1108022.28237169981206149.3895727987
816058.2238053272794720.2730445843
1137224.57543043021110810.7259043786
880682.3019910126911873.3913278035
1180325.49878026661176995.6235827673
952533.5781735645905956.5121243633
762130.4622501581804525.2530681952
619087.6936175337722310.8526596469
1155513.17520000461257841.5425018696
1246246.82775976441193359.5519445217
755292.11436027771013466.2395758638
1150438.94949324481069001.2044136678
1058269.01857032231007905.9411556758
880084.7004478722848093.3600452836
850977.0123103865988349.1292921971
420122.99953232025248290.01822414668
1367641.270383691271657.791613128
1251430.9203186191037216.1920258752
502553.05218755367535226.6882847026
868435.2750090398789428.298157718
1150877.7354432491074499.2489886237
965074.8047437824960989.5249779522
1638632.1507205461447077.0226103803
1098518.13368549081123591.9777747127
1055484.373480787920869.2653165101
1841495.50788487471651048.7232419709
568977.0727690812614440.4815941453
762208.9847574959885866.56194143
496359.97079138213549336.8565138178
1375951.06444204231353527.9902805495
1340074.65298118261310268.8114281502
820250.3894658082799025.7556224847
1227401.5389868441102827.9600097272
636506.0005989884728487.0445337621
721974.551474637788888.1798582273
1079158.65285225861220557.5920161144
696040.1299034554785997.3212494506
1159207.08461658941038724.5997137204
1652845.9806287641569686.800572468
956435.26333484681025245.1948325136
1496729.53576642321358120.0100760646
1159699.96572002861200668.1630648286
1237246.14487660961355501.481290712
992622.769267206997881.0063257776
1308983.6321640771364769.773906997
534077.4554759212645605.8214377048
685922.3851784463837238.7196447882
1029439.23386328961125522.4773512534
1205962.9949533471161935.7240485572
1361872.29101591421393636.4010136714
1401767.90425175851326207.7945141247
783818.6820390386795210.462446636
635419.3652163026713609.0303210001
1238708.75973817961181387.988884679
916140.2212497431982765.5855871364
313651.5032332925528516.1212901031
552279.2140466532507610.6077913372
962081.41999956951047613.0502252323
592397.7261389504545962.8210819429
957283.656354981028695.8363968562
1232004.82983474921396163.6594393752
742016.0551722904596326.8152839774
818289.7642087417833043.1762133166
470008.13822756393508141.2344297292
1200653.3454811421236065.8564832858
893541.45694963521184741.397026373
788427.8399198116845568.057570863
440585.029390805422418.17028356856
839453.2926376425883465.7275176765
1191340.8258754691282748.3770634239
561703.7697294904723710.0728383847
1296146.9388596571368225.6184563981
786559.0248508396730255.635094949
774073.561854088851175.1107518827
745996.3305840503790837.1483632899
1427832.1206591031385517.4734523324
566848.7320986082598472.8634153842
936234.3475902014792928.9758020551
1196687.68676654951265595.4898738102
1209571.07241358211137173.8929220415
897291.1153231284914092.2382243299
614700.7371485097697259.7505183318
1321008.59348566271329488.4970795037
1026505.82056591431073045.2284154273
1384965.65417465781270114.4931836314
851633.9109410639739943.6482060095
1039380.7224796106833344.7360874056
1114901.97262301321044867.6608742396
920498.93738327841050894.286565429
1428797.37189514281400293.014365646
592223.2631006419799046.1917666807
985283.88155783481054632.284272355
1320897.01345565541309225.2875642218
607873.7727559933781146.1962926164
1063743.4241658195940046.9380916283
829794.8232933849995155.2507163691
980049.3901359151940033.992446153
1325294.12109218241236675.0037438902
1281777.58116751051352980.512998526
1242111.42833697731200382.0172763942
842235.8033529122814689.6401144466
697656.5924360289990140.170785212
990893.1600715704952921.5676067672
874497.2654803138822140.5687129903
724993.8892416583703513.2223042552
1136448.4087604561235192.3725420781
737202.457611395806278.843615225
1475349.55201840261297138.492772086
712228.4243027219739914.8973801257
914136.519775298724425.0352186402
1273554.27783518351133487.9537007879
992566.6232646884974166.154883232
1389773.87348942161238070.9232926425
606863.1414738953594007.5497888909
1364306.76868099861310621.8444445697
1005089.8939753319887696.7422942077
934744.0334904651934696.8969382159
616738.2083315281626064.9426276078
1675523.366621691592392.2966824723
1223915.25261775921124809.4249948598
849008.7046985144802259.7896045218
799124.8491575408813617.4409235381
795082.8101752147848350.73522043
1022781.17074291231123944.1892916788
1198313.59809976511319624.0684502833
943485.047267782852753.9066991773
947355.97008645081011202.6426450871
869026.5819988098855561.4687112411
1164968.87663175051088747.481255944
1156329.2740497622980927.8211769373
1170169.25920770851114158.0755165215
1117741.75732422271205484.1100912984
1433493.8022199791480303.7494403129
1112286.046385043927499.1691621444
482689.70337566634685442.40707774
1069238.49970525131175299.33697156
1178846.06581529371215187.197926843
939139.02933896441037763.2797424789
671343.9417927802733029.901383521
1127873.57747254121053100.8731053085
1184462.3199441611199981.1878386685
929247.59953641077873.0135117238
971099.4753986859911412.8534415248
1279681.1543965931297811.5063460781
627733.7433863797710200.808505096
1321743.16617416821150538.2100791768
745586.5735088169948849.2926050196
927677.4223195151946527.2191392025
959416.43666204121197863.4508971921
938171.3555536494971698.5294517521
1056225.68560118861101419.7068086984
814784.2457280058929378.4500109255
716316.4881444586870361.9448002265
987434.74983935131023900.5660654744
437146.0203506594674407.3459708588
1353488.416462971222167.972387637
804453.869783905794796.3893446974
1739761.3726113961664269.8418694614
777144.2542493446872466.5282563958
1168760.42768570571226544.0162460185
855667.17930277571042767.3802427854
631656.4745826736680276.2069024132
729990.0243899535769016.6050279117
1132662.2153922748967683.1689118375
1019880.6530541871995712.9439233765
1450122.7150156011378030.5664760699
1023205.04098955761082303.8539848104
744450.2293097175836689.97458601
729989.3499281745809616.3210268752
1591934.19032791371554321.0688064462
369433.3549647921598276.9278453332
1070720.0584877421267077.5368013745
1473540.75993854411458704.5411193236
678721.8842424268615101.4866774599
720059.8348080008801539.4319240339
785399.1395370425827047.1786269359
1559997.15107147021401696.806724355
1419345.60730258451373461.448767378
1147908.5287110873952579.3929157597
980141.21910766731049258.5079587637
1338424.78836714941236179.892132883
1445731.62594336461343085.6027365774
912422.1464209495986024.9441233184
842086.673327905819616.2033889
1327811.342620421319836.638871708
1426545.96733902741238495.9228213485
1014450.6537930905992971.1107387501
1184614.0870240151197455.5293772817
1271752.43195011281385932.2426101812
857934.5477662288985277.8140644245
1381430.6301887941315424.4411885259
1625508.01310623741567672.6586798355
1194191.87851137441087080.3284879075
1325860.5334219391176599.8452954972
1560693.09827185631621417.318842032
1202050.58426040761199414.0611691694
1144641.81945444621066532.1190356337
1328658.91107238431328970.7985489755
708045.5749205473773200.4972748416
849656.9231925056750136.7822087458
1169050.9848253981078171.9027009453
1044999.3428528216991238.648170589
808373.7030161206919451.7038302314
1166336.25929783981072705.074333834
1377430.0721703251391705.8461686661
1054856.03266700241074757.0142344297
1230391.4682973351184597.9969870672
975385.5554017648880637.2736585191
974805.9937128816769337.1653345348
714706.4288537387798145.2304615858
1253370.14892133881186374.558968672
528485.2467305964489285.4356710748
1200125.44711925141147126.492548386
1128895.1249507668909915.4823739599
1197740.9167663951297352.286601794
1151189.64220953941109010.8355457727
1536899.08331848241515171.462682915
1031046.36542664841104844.4331551911
1040607.31205456761144879.1717425776
1011477.614281221113202.875711985
549947.2482470637650978.5186270108
1454834.98247725941397520.2635718212
1197929.74318649641089645.8547224207
1399662.58446726131248716.2562452233
1432012.87092218521268849.565903726
916717.6046638169850719.0965749226
1393100.42260615621352089.7351276083
1017722.997568472870992.9956932445
873048.3196423554823850.3279265766
1280431.57364784461288606.1680212296
1104109.03502936061191298.6611960395
1504664.28083969541490122.9602132859
1197307.1460081321146230.4642968983
908616.4826240856756205.4895877349
1290755.0360701841225365.9799761237
1033155.32945700511111638.2922763317
1375771.12903727431425448.7000430007
1019127.73295140131096319.3203939828
1142264.24767841171232001.6997954585
685355.4168064342655031.0887157149
1124396.24901270911014772.420132345
945057.3183830888935163.1028807131
984349.61415487561125781.4599292725
1107067.8042590931102620.6417044522
823941.922058669929787.1420864677
1086181.75307894681070932.617471967
768301.8020259616633202.35567358
972417.80891327561045149.7921189233
1212276.35749966281274292.2224089783
727366.947448545501464.14280142216
1363319.84641960291454459.715847996
758886.6887614839706296.5663487022
716344.6279481957800430.0597257749
1029855.7140241184872180.9068571888
1409977.13109577121361389.7718455736
1523915.14468417081551400.475987637
1343484.72673607131311948.5379609624
972670.81332243281097544.0032958793
1295918.3331337231294061.4002897055
1204939.90391927821241985.2430363009
877822.6628716969991516.1358275558
813807.6997244997904108.2839250709
1277780.51220943481286787.9428508612
1020041.7474392444888680.0655112127
1122563.81949876551032023.2381570535
1161995.72817709461201522.7613592711
1153871.4695016337942704.8748191912
896937.6577995939830455.8130233698
1191968.52004987891213021.4489972228
1025461.13442763371177052.0728857345
1306367.81063751761250842.317574222
1272337.5035058371379022.5557490904
1095391.79860125851119648.2751522497
739027.6758369291828800.1326503265
1369753.28174858171232422.4134007706
1178553.61617926041245506.0355174812
1007478.74843115441070923.742318863
1285157.86958563981280126.9679068387
1410331.82513798661527392.3156152824
1026126.58382676741048300.7964176531
1024973.1952142385865556.0273872698
639471.7361335896667371.3528016298
1253359.95400546631330039.7007417125
1584167.85130265151404375.1900859443
1261491.42538357271224942.9029253623
1011909.69443134951007284.0657265182
814378.4821120476805347.2531833379
556839.6371323885635538.9978234568
1158171.725122841006971.6638926025
1447250.99902497841323066.3967166538
735660.455803421820304.8923661094
608794.2466921951751994.3338695527
1365945.08278299451385890.4767785915
925394.135004886800995.1004156009
1496724.38060648181645751.7560509313
930011.57088740311074553.0729885865
1153435.09235301541183788.7083961577
1085494.82011086521140993.8463739795
1305127.3360023461141296.1222557556
1169166.98947810341284572.469060243
727866.5251679078616088.2154225511
1084011.7044689871004926.1973407026
1440106.86389146191267157.672696515
1453663.25175692261536812.995618343
1143377.601699577986636.1053759712
1442632.54122655891399797.9592770399
1479063.21378219431390673.0325383325
983534.15000672955300.5301144882
1292643.52025235771304583.5076019992
1172514.7224739851077653.4492010465
1181663.48357114851128979.1378357243
1565151.545202081494997.0019247592
1260616.80662944681119912.3513037306
1076438.97514348571013389.8988162726
1025701.5949167036970949.7301867935
1400498.26757475941485469.376596244
1030729.58315228951018712.6411432368
832559.7975509297944848.9560431312
1369582.58249144021283716.5838952558
1307173.8715093291133169.6803268725
1195601.96234849351161459.6362088388
1302933.24756927791391687.291785874
1204400.61574209551282445.6257460094
1019425.93675783161137336.3589925957
1257376.17368851861289892.1129793865
943575.13069558191095726.6501419344
1146532.45474056151052431.4097950705
944032.4772626091081143.7024032562
907530.175313622883078.725964243
979282.76306774871168238.720895784
1175781.41757005661140533.6339400834
1249461.56160074911315524.9946291144
1684537.96115637621649410.5170127237
864702.9339482344854298.7951094904
1124463.04040318961135764.0304525201
933306.2877207608884928.2438375726
1462608.69602205531400910.18567556
1008712.57507318641058366.1551441145
1332669.23479852061242754.5186008462
1042144.23091653461059076.9068703959
954154.20689942281154858.5695509822
1032346.86982480241150312.742071597
1046627.0521855621113266.0116603076
1558572.24327146451496187.7371601416
972079.58755369221096310.4445818868
1226586.9214129261217571.463599734
853084.1522068826939011.0924215228
1747244.86330756941729622.5547978105
433247.15658337076580374.9456366086
1049632.18068351571151481.1690748958
800146.2260609316787663.2133700438
1193253.8010433371028313.7031475441
917610.8883953421107099.8564292914
1388530.15668360661363849.221339425
1667560.8793037131707292.003000494
1252391.17984216781190897.3333718837
1003905.05954605271005681.6147620114
1011331.16361934021051221.2153741987
1599860.0795839131551654.7884458192
1366727.66269611081266543.555613446
1184799.27149693711021530.1390886428
1194709.62785815911152041.2485881965
1289008.2166041621311157.628262659
1152269.43076738921067527.800958184
1185743.82417968061358967.9950075168
1309397.04942903921467870.7660667873
1041896.85105748871052604.4400415556
1158742.82993929131132747.4127845406
1277744.73891134961171339.4389392543
985749.787356535974594.3187550073
1372878.53439379181323374.9564002175
1267714.14922671741333242.421498728
1545864.16648349681560183.582175313
642646.4389558511594356.6035692161
1233484.47657809761198407.7134323246
922514.0879743272935844.0464065778
1185935.64136596771120304.2141068336
1586312.15795767171665250.1686344203
949072.24959546481074893.389349218
1165240.17801062461275906.2746595796
1206020.3845585661240767.834079761
1484653.8840703111485149.0089478632
941950.5794564657789078.1967892428
1232466.39976016481201173.4957446363
1095879.4433997157901232.3001008951
1772390.5532732011794245.1901020687
520217.89299136034623085.5295067602
1126137.6814085791104105.9020147454
1110931.82570236711049514.8509138827
1113570.85188848481135234.5410576789
1204103.08659899511249270.7156894007
1055548.67577611421026375.6302916626
606191.8669228128709781.12413564
1548962.8882173821529717.6414794233
1069827.8066391541164856.5820963858
1197437.34406811121004369.2872061627
1191261.86867964851070766.6795706707
1236874.8091879951396626.2307216981
718887.2315009277735275.2813708386
1453108.79381766851320696.364027237
1048302.40878436341118384.3061133851
685775.5980289889781882.820494323
1278991.68869961221304989.4333834639
1427202.27856153971364999.460964878
491907.79437121906630161.2904731538
1548322.50070918281449393.1009493354
758570.7971925931006035.8344603186
1535781.39408547661431095.295272653
815593.7638087127775926.5269752024
805433.7396581171751422.5659948229
1226067.31416024481113055.0547909187
1346379.98494337081316378.9992660498
664298.9713057821710650.5437273039
862407.8170122284822912.1475031972
730043.6450595969645529.2383485152
1145804.2692865551085139.779880534
1167119.10883665881216499.7216937775
1619829.0957201851454675.4617882716
1427108.50115455521472063.6754518528
1105990.69377387061110759.464919638
1115080.65434612381193955.3716524397
839426.1221799824806987.0876085889
1200060.66203741151121794.5775846378
1337472.08515168591465851.9246738767
1153135.22029400691247819.424678804
1204598.03746312581352598.3590069027
1227167.4076018471109147.1874139733
1296467.99364114721380043.750183159
673225.1118895164791236.7464335519
1151233.09546093851043107.0379681755
1381272.88056659721275171.3962852992
1447181.82631216481323382.8769784416
1279160.98758546981289042.3617466553
1190867.43736491211247775.5269285971
899186.156938855977938.6579233631
1009831.1347769842809484.9753809012
1037147.46740242361034688.7373350202
1004041.4348393113811470.2984307986
1287903.3521953531156735.7300791545
1085101.32400570791132305.3467055918
1129613.01002032871143833.0556006096
1135613.43184141651155257.915264259
1272180.1965386671125728.4936930467
622449.6452289193644604.927284074
1245785.05095909231064541.0949953487
1443228.28824282411524120.1410996881
1167421.73902775841217588.4243942774
1180091.49781969981126624.528769602
779106.0224899127724858.2000962985
923246.86207401931009469.2833244475
1177289.886204791109719.2573547834
1148416.909585711188525.211061723
1069292.32685914781182826.0359148616
1495384.00366878531510013.1736796475
1389763.82152621561266058.9122069464
767784.6304433151811498.2929540747
1168993.75880055151169925.378678054
1578136.1653026211509060.920890274
1534889.85346665631662773.784093055
1262232.321307691316895.5016211132
1269486.33722708861244214.5215534153
926880.8505513169938850.1025723573
717825.3596950844875104.0879646186
963531.915230982975694.9481806974
729688.5926317396840499.6759487232
1047689.26574636261031419.6901947283
1130677.46584398181192741.0443031932
1357575.85161510621463881.613711724
924346.16480241691076022.0235328865
1108204.58686275571139743.9382797102
1614667.52792398631609930.4498600084
954732.90384028821027460.414248751
1184527.37439720291215726.7163761863
1265927.3597381961441036.6586380177
980983.21095235841137973.125259302
554253.0540102996760230.9588312558
991398.8218655173981487.6852361662
1630952.8835563681449719.0623719017
911071.83355306591079965.1878279815
1238396.4120625261352993.0274222651
1468738.75486903821286757.000637685
1004471.6608776528992503.915281008
1582765.5924768121639067.2694958234
1440736.58325828221322827.5360944443
856261.615200036847434.5162328994
1412626.51874178141350746.826872168
1127248.6102336831265849.0366661903
1393897.39021981371424619.065258346
864446.7942204889857779.2347182296
798073.946177208854769.5690358272
1016526.59374354561030523.4564326443
821859.065727853734487.7872019713
1522143.64138565961409281.3413431342
944979.0094316949940550.0805320209
1298980.82894999651308816.637552233
1385400.45567306081474041.5298614018
642809.9667434745801185.4338855706
1444701.32791986431405932.967691111
986285.38185614011035801.5970689873
762167.2533312994768783.8442786653
1040376.9951696122991835.604585798
1029354.49485583161095746.576749432
1474379.44008214661351647.4347646465
1155752.74474025941184304.5127788386
1234531.60050334461149871.9827740104
1111085.0168910609934166.343750786
945551.14893088769737.2754798504
1497377.1808672951490158.8832034105
1318597.7147786561237956.9029880925
1244916.5475432881318256.8721174384
1384478.30454825381313326.5369834444
1322782.76026948221421239.04591212
1378269.57282251051302325.2276125802
1372549.78249221431250706.029195013
1301089.71150823291310712.210449739
579585.6980204432657343.6723522055
1467910.56944260841493137.187042559
1009769.0775382696967094.9475348857
1242114.10087935421137626.935100461
901881.7426862385786046.0986668998
930493.33131078890240.676627731
1309985.88679407931426676.6508492427
1045704.70032845591311951.541917651
796666.1224321837691015.7766246707
1051519.0657661431026897.2307619685
1255576.2729543581068269.469509183
906011.38532356161127404.3895330247
1149524.6985911071125779.8670683592
626085.9330046533667266.6095797154
1217061.25364758261137383.9169365717
1360908.31962000581311196.1955455723
1168444.882224691282055.6536308527
729781.569559095840956.7551592416
1820189.53280409291736566.0012840861
873509.18952667191006136.1973859118
1417047.6271106651219081.410592217
758262.6121106534750165.655616317
1321037.41361476921138372.2118209032
960083.9968510192926200.5570275337
1702406.03893520961606359.7052839966
1417158.5373955791492465.0289731175
839194.0689419047689136.302640182
1362239.05354028291302281.9288055464
1373048.099022991144996.4968939219
1088222.4209022115809405.7792491564
1381117.70135142981484027.8479492897
1714266.27375534221697832.4893719023
1361521.98293762581265923.77921863
1660975.17147366631704795.0473477654
1687998.93296047461495366.6182349627
1168574.6655996051130846.0273020999
1530294.57733992631401889.1575734043
1063630.9275004551131086.0870185113
1406435.80621744021254115.9203496338
1206393.18149952541301787.3451435561
1502447.9167287891722593.0340341013
1394637.64997722951436233.8324858886
1103352.60093981821103133.4432465043
1251688.61570287431257659.5689670704
1111108.50121857951121040.0840725056
792449.5430652391878079.6770991762
1218011.0607878341273053.4884719043
1256599.17875556141206141.4685808318
914325.029151274858238.9403620875
821598.9851950513860854.1087759654
1222412.0198540861326636.763785867
881443.9247264569942960.6392926876
1109059.0536268011165907.0830361228
1034180.94926110921091217.5702869906
1102943.3514449215972138.4941715025
1214986.8857154441216022.8890055488
1440897.41242886291413415.694114481
1134397.75771536581158121.8743459824
1118165.86617234981102094.5376149537
1375215.06159392351484068.6131472439
997618.6797694248882051.2498139832
1674680.740738481555325.7455454255
949892.5313701816925820.4653137038
1468752.65742697521348402.9441114399
1328572.19050508431388393.655268442
1109559.85160267121138441.714231735
1481146.9504988941400175.625500251
924728.537366032877382.3070372553
1160246.72966111431132443.9309693235
1245400.9553108051212009.182309276
1714445.17463658261609460.4310125988
1175190.67297647381102218.0850256477
1129798.37272535221253056.5543233533
1433260.22774187571468067.016656388
1413729.75740521911268362.983904256
1041237.81738656151134638.6281142836
1058517.8099255881066745.649985637
864899.4849738175828365.2575971051
1613037.50893710181629017.821150029
1366854.24050653211435158.3001885866
1053815.09690961471125074.9501688615
863448.392442468828747.3529195413
1641226.58429892851590372.267068251
968082.1645233814928410.9740476739
1300265.21041546621331159.7802325338
807916.3134010027837350.7583420468
1096052.86772001651101291.3625990883
1074263.31723635851220368.5254776343
1150658.595163121225165.5084261107
973096.358177584851091.9291759431
1238938.29053199941161469.7512826584
1688279.30811024881550277.1290128976
1071109.91658509521089352.0822324003
1244631.51935825821231494.6946885404
670063.0223057014813057.6301534646
976649.01660866091004644.7492058179
1550931.06784448911422041.287634198
949879.93388850041040159.2716770298
1467849.8178345621475311.0903927065
1267443.39761177431206772.894042184
880851.0551992012901534.9255967895
1535781.95982919121449920.4017890585
1494101.4447195381440549.4758872464
1998368.7406977011875273.6041229898
1229702.94836406571383244.646439842
1323959.7991068131267409.8366395663
1527691.70068086661397786.4579615388
1760734.69036401411488585.9699235866
1053338.5923717965974515.7559454893
1343394.63430899221312236.9193653902
1222041.0158329071314782.0111143198
1057347.16605277641001977.8390810173
1557914.88977842431500700.3834062568
1028966.36792927191077659.3499803334
962747.1638994686926283.6081900559
1164209.61937712951210802.675733503
879511.1964474785878373.4763675258
857697.1254910927855615.0706291371
1341870.3537864461282958.8057338842
843650.8278900945830177.5699678287
1273120.25882705741345972.5042994344
1482123.62468681881422619.7288952176
810751.7250413778888089.1203715303
1043483.9151320348948490.2085766662
1513223.5348634051502268.2823159788
1564252.52573748631549734.489650935
911202.1683461091933101.1292296085
823864.3877373383852881.4781133649
1198656.87240768711264872.5117520872
1252416.69126182771210754.30773889
1059870.9648322463952491.8804383506
1048969.49327387571084614.4500266504
522638.99887346616713.2117418391
1255736.40858762481232505.2630860498
1076032.5535246094982502.9704781258
837540.1697407691924250.4951713947
1446983.5422764611275639.9822202595
1368134.99768213831196543.8168984787
1445804.83165147971425288.9535339046
1214941.76172658221212755.7051149863
1427890.0464917241424926.0288333856
943309.44860395421039216.0335276187
1213382.22263646961282281.7923279144
1608726.6805464481516323.3729102854
1294647.5891671851432114.3393752463
974599.9587641745949977.6791919288
1210496.62504492771252571.7193882968
1270869.7831719251291178.402955711
846055.7174491595915542.1650637113
1490718.3349493351616395.1521689836
1742566.00604801881615199.0100850547
1706291.99055932141461132.4196026567
1312093.36119536661438655.864854307
866328.1313278642994157.4076171434
1400609.0340781211297428.172654143
812858.3569510883941758.7755600824
1274983.64807314451341417.9265382285
1100152.08776636381294565.5453525442
1660678.03508683881717525.8322766414
1451930.63128602531382808.706483543
760876.0221585269509067.85289323656
1810158.48670885571761400.4462983292
1203089.98901769771241108.666502621
1159953.59292049851203116.8338658088
1123991.9772807721145524.0721393353
1186688.5059383491005650.3814904066
1202987.82934713571135015.6720189792
1289082.36302500261122168.8857414876
1085103.0029720521180670.2774534058
961311.7291737748887356.067177311
1279464.64669701221242091.2093406995
842296.2673297737920276.5886251773
1234837.20600700261337027.7859704606
1797621.2204360951720795.579271596
1117011.10618470661221301.6131123267
1373022.24441615661383679.2579802102
1557794.02127225721500446.251281944
1747911.49585289141798905.5284058992
895441.022143891832421.0271751247
1478823.64727429461355299.09688999
1347578.53033791951361932.6454565036
663128.8400534061731888.0661590309
1343537.17846673351249804.4836258646
1521141.34530098251471412.4602260897
1084945.3996676442990394.960448728
1116351.7534385773960207.7909628171
1331656.49397360111346645.4911249774
869924.0584222449951443.5156126851
1624842.12377978441636900.3691297546
1153029.61571985931139343.5471691303
1300362.02807237231467970.9951003958
1125696.8623678181016726.1935512917
1518169.44380876751333810.3595254817
893919.03881637591104244.7691429588
1485677.06380680741532289.4901279304
898281.9024826281901677.7484284402
1099959.63901247531121041.6183585264
840682.6088766105945497.6464544274
1033290.97490048921118740.1716991793
1530124.01631689541534471.4941413319
1206931.65045261571117407.3372774152
1109260.85430588151072151.648185825
1321257.25057208561268465.2873658668
1702526.05634648841454301.0113710887
1140918.8054659241074010.5238871686
1095597.94383351210256.5746679697
1446756.86276142321360795.033696996
1084255.6782722834779032.2843943811
1282339.34987649761064496.131604801
1066040.7886573321160728.3480412299
1677612.44214261502471.2310868981
1481940.76150788371391216.766692319
1318058.06334556341404397.7439067923
1457022.63039826141458755.2967011696
1412881.78396931781331070.481135123
1757395.78723971131743364.5305919927
1220276.55134350221194407.0153163099
1072253.8336551161133178.9851969858
1077813.5929946451129969.9864225676
1259733.64381107521256092.75718292
1107159.78060590571266109.506283916
1162469.88691581581075616.7552921497
1425632.54197419971448236.4854428028
1259163.06524365881186529.4296713588
1181877.18323752661179723.9106690278
1130537.99274975131071849.845110532
1313304.58773627231220164.991543308
1280669.87346604771283774.2973670545
1400104.87076026151331128.6527527664
1507331.28820722041580761.3677359624
1392083.8178755691568790.4574814169
682632.8048559022865943.1055412879
733299.7945489064791771.5632077153
714142.2406539195704253.5292579285
1023965.40341073021013284.0664141849
1156786.08388109711261380.2538794535
1154126.2156885691192860.6960170749
1330929.47215358841396817.5389325432
1537335.89711958961653984.5178657845
1738788.38189406881731044.5203081062
694472.1081139629815579.16997841
1170204.33909911661178826.6930987816
1180989.32402634571258372.2325461735
2235294.71826975232117357.849784543
660364.9813358303692563.198067571
1384802.4642054221317420.414206339
1527492.34389230821432486.1983669018
1343162.63662214481384719.483988619
995137.20239377951058300.900481794
879062.5907073612900499.5604007323
1565931.19168191471579061.950516019
1059262.0393685936994094.5013645636
1509962.0217769791502961.3852814217
1299673.7419953381286378.9031137181
984010.7052899195883689.2965707192
1514349.6921977011512032.3243607422
1396241.19810412431366093.1809237623
800628.7470270158964229.7445072411
1737759.05002945311735966.7557347054
1381830.7790291031466871.8759404332
1473680.60373919971329099.6569175227
1106149.68565739271160192.6862747055
1296645.3749405651231967.5869796677
717273.185257682853203.726812901
1698219.7574646941674109.2270953003
1059113.72127546861150141.4703240138
1212939.9535175931181064.0102058453
1148508.02525255221393503.2049549608
1104701.23442073211044379.6660785656
1070318.8148959314938227.2578504686
1433614.9667458861405764.270174338
1268703.81079339561253042.0418245937
1138748.96434368851176606.0747251753
1018173.70306395061117661.4006298785
1152798.5789672081119932.3704956137
578396.2214702787542682.4705105876
1789607.52613988871760688.9753802083
1277380.52860852521156347.5271694842
1681340.63502116251662269.3816860514
1246270.0096858071407473.094322363
1114957.5968694971051799.5909945518
839629.5121744731888769.5089500216
1446597.1220574051362785.0513787046
1197515.45422483681232575.9913608562
726883.8689485132791159.4395892816
1463003.05588126251412877.220363387
1599634.46503679431435637.8699328331
1411266.41127969981406644.9625469763
1028964.47393477021118698.1415921012
956241.9912803004962159.9499510294
1389287.47386999361301761.2780572781
1358526.74126212491289841.878977986
1326946.72501394571185630.1571597927
1429951.803899331411864.6974056638
1391159.4336812661470683.6245235028
1352547.69336060231355112.1806233982
951243.854076582994985.3412754699
1261715.46166599571239297.52369788
1580951.5785685221511409.2813066142
1379386.38293300241267870.6576911202
1270963.56326371041334558.3254499868
1675557.27123078541799232.74837609
1398760.0465083871233973.530277728
1075675.10763008051159508.0734889074
765505.3475276389826435.6324583092
1535564.55202975781409041.99679258
1453597.50667675031194901.9042757219
1217021.5187407541371310.9847266558
1210400.12695473151231420.7310595037
1308017.31423917951215654.4539298122
1244955.46071153371276822.554399733
1288122.62434605441025156.6311508231
1555497.54638866341394512.9947019652
1423296.1180004311456778.6864896608
1222701.01211165241351502.8405922484
993725.21718816051051362.935471905
1520263.75564127281463999.4004774159
1741052.9596220361757013.682375216
1012545.4916159144985829.0605758312
1342997.64492883951241388.8166285334
1525601.79137374061319174.493800248
868694.0736998019920015.4420964546
1131618.91336484461015050.5471460186
1172619.59705913581121766.5155420885
1280588.34189717451297452.8445774196
1712282.25936341821616966.6021996057
1385978.98411983271310049.2797646578
1249223.83104404921363879.715390577
1110525.9886739231227112.5986903254
1387701.11105295761322782.6693331655
1489574.13701378181409958.9335543625
1209964.352331241259031.358319141
1352917.17686139771489629.8870741515
1541746.29055905181460406.5736325704
1655466.73582652261532224.6150021846
1499153.08083987861309858.6762433113
1480328.34547335381389538.5662279916
732244.1580695552779506.6396280122
1360787.87121155141389226.2807439165
850593.33765771381055954.9172459366
1354077.4982377121383514.6948916768
976540.09850095921049756.5275031258
1459540.13304205031448135.28884653
1673538.16868396481673559.3535208954
1599478.98566447691548742.4500882071
684049.9193111222876578.8422081121
965136.33851673911160136.541331077
1421135.8149540991403813.3390501384
1273868.06365870851122032.9841225813
1779858.27425291341662298.228200797
1246485.18352108051201810.3872565813
1237902.82007374661121504.5844244035
994654.4094247869952665.5310807172
799191.0381356808841460.2953564031
1210184.017617571335188.98631929
1044017.43164551741191497.1631234623
1405933.01869924861409620.7165844222
1392313.72612955631391269.1646250142
973299.86178871491007986.0968800257
1417403.31186056981320568.8910535444
1321888.26829997291360302.990745563
1548598.75456926461519397.2720301007
1524586.78721670081354353.3217112408
1215608.53105596571203370.7073141043
952912.20124612321125394.002533793
885709.7642844076930857.310947401
1214334.9731515771170398.4868249618
1195986.29883487431438586.5531192152
1137059.1884843191277510.3920486323
1049661.0388466391183036.9050002513
1547888.63304819751416176.8494368033
1383565.69618952881278628.3597821118
1214262.69927371711257904.2445133035
865816.67592612681015935.9901762498
1024907.9401935096924829.9802102786
1162854.55194127631321551.1115060947
934610.39533488441012920.4036508705
1379456.03071087021317939.0828797836
1357250.57125695771410767.080959376
1260241.39606227121250993.6312635397
1367142.716695011352767.2390467995
1355556.95364972231369847.1061542765
1613414.23305072961583859.5071139997
1640185.7982968181566869.063328336
886124.7256403731921116.9863703805
1441956.20193639261387191.6094236593
1187113.82618070071213599.3598722275
1280910.1899330041277616.2476954698
1077754.22596212311065055.1729057003
1434240.35585610431476248.6591315758
1952622.4017316991791674.5843947157
1092701.3922436751225631.6574756955
1375497.97292161151408824.3310162975
1101826.3145402991988424.2784737824
997448.7280769936943420.5417655539
1350459.11556817381537291.6042916668
1455691.7965069571335040.639974048
1563083.3360165571608789.482506685
751324.1387490695857541.5546759642
1308231.7694117661369249.922264683
1346049.65586650141412124.1900373297
1730662.39293344271643032.0233858768
1920527.5297556511814392.4259317396
1061517.70945388291116119.2044746294
1752967.60490685721657613.5684889127
1398353.5906641041203289.6830739593
1124042.94809804861126083.9819665886
1501303.9641407511618933.8435041225
1062105.30812738771008967.9130956247
1235501.4861703721077672.087533399
1430813.41289062241250892.5705736177
803689.15193808571032641.9055743627
1447325.63969773731508560.7491160086
1460758.62626443621544230.3601438073
1308508.11898284151259185.9189442853
1372806.61636633961294811.182915037
1314245.81999732321410799.9870655048
742449.3106376197773789.5071448656
1574279.81397754261625922.1140428446
1256469.6415958031266992.4477409916
1055930.22444137261095361.7386656296
1584213.957485021431144.754913372
1500472.82722154031509973.396394311
1475734.21743972721635912.7591463951
1101341.19443828471186298.489763599
1035976.9528697081059785.2697554948
1403219.3705734441448739.9030793188
1049672.24860723081165123.1051625134
1289201.3907333041322632.497879704
1188255.0814990231127620.2151665366
1203850.10427601821186743.5972191496
1135079.34529202081283412.6681429786
1361828.84804824091342399.1866554837
1289042.1214693331330937.4035059982
1085534.1785737381230807.456886774
859078.64771755621022576.429747717
1903533.08434939311840560.424094149
1072914.9964424041123905.2767439494
1049981.35158313161106625.793738584
1399812.61273423651432945.391229128
1063069.9164250881189728.465805362
1371640.93171142321409913.4886008366
1462899.03145554921534129.0964760683
1270047.5281293981355024.4703934318
995849.77510982221231373.6204595221
1336134.4858821361447355.8242278858
1134055.40305793631357289.3148014736
1157189.4377037785990076.2436666256
1169653.8213775471335372.741898593
1930805.9466945631892431.8445104798
1270390.24846833571350372.6500099436
1251757.19301297841089099.445811517
1206250.6477503871222054.0088301874
1411054.31694068271183635.375335461
995813.2160648316974458.450381855
1110114.22034477441214869.619919986
1039517.5335082016974401.0113084242
1208761.05583715141290319.6518305028
1273067.0360275621357639.735748915
1629983.84670324251681689.4931265777
1650770.92968132721543230.3432907215
1127174.71254581771028861.614910732
1085943.07602460221085224.1346929455
985866.03164926781094685.618184805
1625166.6484895281544867.4046496474
1094792.00320170261228674.934036056
1692308.58976610591600264.7507576318
1723424.67153876271624947.6223984798
1202574.35303880881122413.6250320808
1014430.12056630591074965.0329685942
1607161.63714503241595748.9185726615
1479758.31752676381588527.6096233092
1212899.21865627151297587.1400887906
1123386.53120028721243781.9770315965
1304511.8990685661428703.2835228932
1584615.573838981629119.3338822061
699222.836143786793227.3900209726
1554986.6948772131552809.8009708882
1806231.45175895631663905.9825991616
1629345.7865328651519750.7454401702
1420858.82358582181281710.1208010279
1160397.82173002351151029.3003767082
998773.99725847881106015.287304629
1626592.9910610071609062.6674830643
1813857.8263612871735012.217845941
1335848.33227761831384291.442774992
1243501.65083870621320867.4632689143
1442372.04360411431530026.6725305617
1394970.59858556951387802.4459325839
1726364.39797808021751579.592041473
1434144.26087246421483365.5639644135
1222689.52337959081327045.6114660841
1062095.4676267491122929.4806373343
1170705.16624077181181500.4898134521
1293461.79788638741304471.7606849466
1481946.1940764991580237.5827510292
1727006.95067822191873490.114464988
1367130.34822714211410431.9651538092
1269293.20873604411266237.7881421312
960918.65844757881036838.1654457459
1464710.20636235531359786.9721347317
1270928.03436998881233342.8634423725
1638094.53784796571552252.9109785617
948788.2757094484994734.5487001846
987447.77748579141030665.1059994344
679627.5955772134852634.022228587
1434803.06130817811298720.661739925
1190213.51290501351392267.7652026769
1507035.87371330961441430.8014132958
1344869.2797064921437452.2850194
1280199.29465540311306442.1918488657
1348883.3214785421350986.33607593
1411756.61863454691494487.6138664242
1415647.5534372371538604.8485574853
1492521.86651816941396014.1901939427
1306674.65995119931238954.5651915097
1439714.28056099941219257.6681901566
1172385.89770456291152739.116069362
1244881.36324168831443416.1275080657
1291759.3926606811253317.0011893958
1748864.7145268911690260.8663586862
1291331.51848582061303600.064574772
1537897.11811872081572493.5912899505
1462360.600877871584554.8125484595
1377939.77450812351331607.3415076584
1161232.65746201411163204.166778442
1394518.41546763151468034.8613624112
1288069.2264489161174442.1127915555
1796245.80790556341697686.0244313888
1316129.30905726851392657.0576508623
1100093.9092752631087264.3038905384
1341722.83596914731434850.46862055
1049007.0166559054921649.8467333405
1506651.15657351631538870.0207580808
1347234.09302709651359458.4225477185
1388218.52944994281346259.8890243229
984421.22527946161111970.239730727
1260814.43187301721184537.0659936937
1492095.14319743961491962.7708038404
1039332.667386882865224.6612681826
1629573.88592784881490117.7790054325
1521730.7914032711428657.7418744238
1386351.14530393481429869.8924460108
1368106.8732177151290749.8487601872
1496210.21585342961479427.7699068007
1587585.48471174971657776.38568943
1640359.13922954471514312.1080257846
1190442.12274025291177060.2202590173
1153470.43974785651170510.1025795368
1447492.9643952941544235.556115056
1176111.788295631150038.1677775611
1515005.38416380131554402.5591586106
1111307.064545113913629.9988296432
1409892.08977612081503496.6891943435
1259665.6029816431263582.783143174
1288426.69390285321338849.7129283445
1376346.3589648951410552.8089673813
1537765.66056849411792686.8699873667
1696977.66283259561738551.5700947652
1251873.62423265821152361.8147412133
1235144.09637726241206017.2321929
766078.3707692815887650.9712332152
1306288.6226800671198044.1160272136
1710966.03563050881733395.0238416037
1453327.91633351681524977.8927519568
1021122.05234751231227462.6316856118
1423125.54126977041325482.1374203167
1165990.60369677451003760.2378087114
1354928.95009614431506963.3481339165
1642844.6486355871541371.8484839285
1109586.41119452361168646.121822672
1361230.12123515711523225.5382218552
1455107.45111252741371172.0447690524
1574211.6489130641616628.5728428103
861657.3994253613821521.8999039559
1912825.2852177691751873.032783078
1536992.86567203581454339.0319204135
1513846.59470778261320531.9551115618
1525533.4066255111391626.144969365
1295099.4367771261347157.2872116547
1819900.63664371431881856.5998425167
1363086.90453255711415829.7707650256
1463367.82082536541290813.1849929066
1653232.55108508631566570.9779977687
1168627.65083449681169580.9088598294
1680788.2865576351611877.7497260496
1356691.38720206541485932.9779201937
1434575.10990828371405685.5273090224
1194594.9883664921130436.9497760474
1234636.451819041245843.3211270864
1596180.56843652041573425.1170600327
1574181.73175317541381203.9920206591
1003266.87623526691079472.641312697
1121023.43701054711268495.3725271178
1337973.73201597411362925.1763465065
944186.1590684241002526.4508435256
966620.51411069721138544.9950269973
1418977.82858253431457459.2140564825
790721.3677899047961721.2697906811
1194515.33809665871313819.137997923
1426695.68639930061342607.8752123183
852982.5643785995885060.4742804896
1713351.39415150461562151.4410505597
1270297.54493105361339972.6907270597
1279279.79981790441186869.40702454
1039794.76744781921021059.8761346405
1020842.53135241161106278.2138733673
1368670.29921318821326544.0522564868
1365081.17753984661281291.4712785464
1324470.44147500121237085.6744865412
1138609.1729369651154490.996663623
1604207.68427661781416383.054948349
1518319.6407040691517028.9907287671
1306056.56543001881210382.829307877
720080.2320528892715659.1956185196
1428212.03436285541422148.7166539421
1648246.77420560481573640.571694687
1199193.83132951121275496.9206860312
1245053.43252749141344603.7240891382
635530.8448860593622059.4854165884
962591.6565767031891728.7409251304
1396082.35204524691273009.6502698343
1065679.12080298881048230.3465432371
1956438.65143525251748209.1446810272
1399892.2556857361317355.4221611307
1174779.15776155591275672.6694800258
1637335.30278856821526172.9968129275
1549031.0930417031525506.3275622404
1084408.4399535931046123.896130262
978103.6192464159971315.655715731
1250494.73970568551259768.8930549198
1541127.34351624571526084.743397322
1168919.400794191259914.0992989107
1816217.00697667691709960.320521296
1126450.42617444651112772.6072076214
1004124.9090759716839938.8145001838
1516419.72071884571545499.4660975635
1287030.93169089381413693.0733436327
1351007.04085809921356337.0626472007
1123765.34625319951067800.8800270339
1249417.8965526211240827.9594831988
1844929.1555762441527687.7452601758
1061785.58338051241073159.6604388212
1119992.61883545181222460.1297569424
1281537.36816605161241414.8472490953
1603627.9377496941476958.3583176075
1887529.37663516751716501.3749777526
1535844.89615701021569539.5123709394
1553592.97994692271443184.3019938231
1709667.18884546571710604.3317055525
1614373.96398310571690971.7866773764
1023162.95290662771105449.062617164
1587357.94643058461509444.4323655074
1268134.92922798151383727.0635404172
1181338.16098867921093092.1375125987
1373512.30177617261120652.5933660474
1765281.09322945821492002.2835938204
1152145.91201190021241185.2792857005
1199618.9426660951120172.4967475021
1423025.10146329251364539.5063357404
2108376.1658033472126481.0520968987
1636906.28837784961617532.0641430328
1166558.37358270071361918.3281743387
1231511.9311577471226714.2387678572
1716323.3481280521825659.1154871108
890887.6807315941905346.259681744
1378937.8773844431443257.3828564552
1742938.77602317881818477.2691919273
1560746.86568913681605720.3754763016
1412501.24550754181508894.4199197735
1327961.09821932481260341.9072778109
1103206.754968091151150.99039653
1623100.8398756271563929.5917164665
1418723.6569842291390590.104319665
1657667.33216394881499841.6585816308
1659100.12428636621505792.325373691
1640646.66983515191701515.5662158253
1402146.873346611324625.664257782
1967384.77782106031899582.5007639807
1102259.53855691233151.1066043642
1498640.55065037031427078.4629757311
1235226.4778327071261331.329233712
1114667.24948651041191954.3612752142
1592768.24182693381600069.6408756953
1592210.1759231311624476.1645669844
1448573.84467798541324356.220481155
1762214.67958188571710497.3526677946
1068856.2267482531135852.1857184814
1220001.33423994881159658.372342884
1415349.64966796391357629.8640534026
1113856.54339856771095283.6052892366
1574919.90634630081538363.2287243106
1663473.12082828461520749.9057704736
1450996.03817929021472406.693865838
1388782.88740135431333566.1838001003
1308243.9222358431364374.2905112184
1530848.09410903841406533.8451268543
1183014.50867395151305647.977286465
1337966.92675928451155952.3515146095
1379169.44873068181353687.4801676068
1047452.50808135321127056.0653057587
1370830.38859788211369725.5262108035
1534479.9065644211355801.2436539782
1499356.11997187741484790.3476854875
1240864.15447193061284025.9469536962
1321388.6193308721404954.887419141
1236308.27994450271040287.2588963988
1036277.06246329691056825.6532362378
1686562.16857339191584840.6074404716
1695706.13152543181627760.3923927452
1702090.63528861726936.2322457815
1375736.95658068431320332.4036921682
1057252.58262110061140673.86841466
1405505.24370139721316962.4425126538
1518478.03272608531424160.798084612
1754770.59020686431716111.5903406153
1634781.2738268861491799.9257040983
834185.5784090377853605.8520856639
1590804.04437505571560165.971874474
1361841.95171550871407689.1466394868
1282365.46202367781499756.6544998926
1471784.00517606251518564.2544295308
1491838.49444346851512729.1268101716
1567745.80674511751489276.9910199968
1765809.4320662971707683.9216776323
1484688.23403353431513381.5852591298
1558758.79585876061664644.4171342412
1641873.9662868341549548.085463407
1457672.905688561488583.5574356648
1220133.35833031081362367.4011113378
1521745.6630062731560245.593221541
1371298.42460504151506497.4986085212
1880178.6473419691870156.9798388379
1456486.2929631471380047.3882708992
988746.4205867315908986.8405837119
1553459.36448355251611683.8226998542
1618721.13842984131580859.896010776
1432756.51709420581433469.6322164508
1522954.93892691381600294.1523875417
1299126.829855491249466.5195293599
1022342.5736360821101864.4268704536
1480674.7988251411594310.7560748924
1558547.5778375241641650.0754594123
1935831.03905680471886873.3622018443
1392685.28507807661473998.634727695
1928728.79155593761949180.137872925
1378399.1090639041562633.4823614345
1517152.58462545741430572.0093705337
1257101.5928923121357044.1101700044
1132146.32043532351103742.496210055
1626125.16564979521651850.46943744
1388596.2433040041426876.3276733174
1532845.72311946031567316.6390749337
1412619.70994713061324212.4488487244
1522099.8307889291544085.6259235512
1748782.80864004461694682.5542242927
1359978.1599388871326544.7477197591
1578141.05313424321514884.3979464406
1104115.69278355571230315.7651875895
1554634.99469860041553343.086400243
1080170.90685799791146107.6253422145
1810782.41345475031703473.0867432738
1214689.1837044731298296.1573622846
1718876.7948187751791995.3279297063
1436995.20045098941334865.2176085073
828120.9549888151993080.1870070486
2059301.34341981451988310.7475135662
1824987.70625175561752852.0894664042
1522083.9441530871616685.2037755027
1206539.66596189841236829.1113624694
978312.74841912571203445.1146061746
1529830.36845470621514184.4133892069
1417275.6672322321298012.387929094
1767399.28994794961845292.684626908
1315666.87392321621216340.7743597203
1528900.85636974781544183.043541771
1584439.71283211751591261.6735113347
1727592.63722010121716301.3116648523
1813856.31412069381812301.0550475717
1554301.9380817371640887.2062857263
1622837.35303381537366.475588691
1353635.41039631771407944.4843516
1642164.21611554691447135.7542318986
962069.00204493921115100.8976874738
1203623.84084199041357252.9643184822
1212440.2897629451219374.4048287054
936553.7042681208961833.4095117394
1453312.46792979751415254.1179110021
1025417.88751949441128445.8907592422
1587622.64123855971556596.0364964
1093344.57650394091065476.452712452
1469237.205192521513494.3736094353
1637649.9047709421774852.039631716
1721005.41950458031799757.6028008359
1506656.82602291181442506.8219333086
1635151.18556572381378798.3450342463
1290043.36661448871348511.1099262163
1228362.7468960661203658.2917777891
1102516.58384142841183273.0233491356
1419158.95904796571402474.0835414631
1107031.24634947841042235.7601170251
1535152.07371691221712920.3103077803
1829101.54948319841780034.5208318075
1091479.56013223061144511.8796251323
1137069.307179011331972.4966515973
1455554.82909215851540732.3158133319
1246218.31006062241281386.4694791576
1641739.51806144281599595.0034498489
1241386.73697899241292509.4712678115
1009854.704936431049493.8196241166
1598593.7326673991498716.3800691823
1664147.63907044031746206.952126814
1278204.78156291411299192.1266400772
1649156.60763173461501922.1053063618
1322010.05668190451221331.3476950373
985059.30580658871015263.7719784025
1064854.3089401251064565.8626965252
1517666.8545196221425511.841139752
1386306.10339466181344676.9925738587
1185616.34001421931305151.0780481105
1126042.40497140771264223.0405676495
1309938.76715167521301750.692002778
1240754.9320463821239099.2060157442
1399909.04869687651555183.678004892
1657363.05709339661638147.3115957687
1246830.18842862871246562.4108705842
1535262.44079042411536087.375853295
1224186.69592599621172430.2225876758
1517141.6228245281473630.5832627364
1390251.4199340811285045.8683514292
1639099.3776237021748064.0642025825
1448081.25117197591334464.0133835599
1539129.3638111811438322.809887718
1003701.04958274761010108.1525645838
1519415.35272758341375360.371692976
1838503.99427184881757908.2860256517
1822987.81972458031860654.9996169806
1843720.64786571721645.4871845758
990725.65175710511103956.7280341568
1075596.58658519881101600.0429917574
975921.86335967711095223.2620145394
1491145.24047705971590043.530402164
1004430.32436196051055499.4134941064
1884385.64950861711716204.368225433
1930802.91896111241812702.0346542057
1729392.20416728131623216.4132517055
1292592.3920967191327396.8179890825
1582605.53510265661629135.025556378
1142113.38414845151132054.102589856
1491153.03012842521404835.8837752854
1216888.02027705471222455.4338777177
1546957.22646190761477688.755170918
1676070.942965191734018.4716242095
1418310.08483902711289758.574780827
1277112.1169454671189402.972900846
1492965.73346575121529836.1734500406
1573936.56447772151567440.0482935281
1221823.7044698351161907.6571631818
923444.1447612592992626.4385883803
1245947.10235498381308142.1577985962
1287784.30403336141309807.4169271877
1222726.56436106771307123.9464494674
1248741.86467450141119249.8470588424
1566567.8831386951640870.4206426935
1384328.12218859161369454.5946941245
1536208.3661351181414487.0433050282
1555320.50000111971542914.0456590606
1283401.7892518741227145.9320257562
1440246.32987309181337985.489779496
1081150.12548380741162990.6164335678
1456969.57682194751625432.5427946784
1560270.48520997541461316.765861073
1550702.4784025511607203.1510998355
1085218.8587070771250538.9946139911
1398466.62782411581476313.854191138
1276471.58097180441321115.39849857
1598159.22695110321608505.6426381944
1592664.70039376571736837.6181577127
1214320.57436406151152994.1488909503
1248845.20903196841453803.7882920774
1339254.72679928081297528.9849137291
1241182.83496703421137181.458826391
1914072.94778813581726104.9241763605
1005843.916993128862451.6262604827
1120851.51941996371047097.3203886435
1084013.78490628771105614.752457418
1201785.66667179831320629.3673813264
1369186.07029791711359529.5690354453
1621035.90271747181767158.8605842479
1261761.23093977061388605.8488978725
1476392.55075533081347312.432427926
1770616.92993542461684524.013125646
1490539.05810979471591086.688990987
1046030.11422824951172190.0612436072
1172188.19350913911324666.2765898881
1314770.46994937681330694.3489463073
1428247.0741846761433060.6661745724
1231157.25514744041361458.5820246409
1380215.51522474951393689.9722249825
1510996.43526688521537368.2492732638
1656785.44770053911818168.6788913533
1378863.68837721041485861.8698657467
1860358.4683120671849698.0430386076
965318.6957876944906033.6415168243
1380070.4501178971346583.085864258
1262552.6859178031293771.7890494969
1626321.32095835941755896.1215432743
1425366.4134331491495078.0230842498
1457230.64624155961469435.8815075103
1546408.5584136391617282.6014587749
1141916.52543889481087389.4590739626
1795093.03400894371757199.1455994518
1924561.8071798732014143.8268212778
1196064.32994418821100627.6513045924
1295014.61828101781396862.639104568
1491811.6611229511546941.848707872
1377447.34852065841374217.046597893
1360100.71924397771289359.2570328526
1420648.28086981711467781.2522651982
1553854.4341999591635048.1388462493
1753820.62245210471937247.9448209489
1556786.60019477481522236.9180547143
1696086.16810426811766684.5762698138
1614916.46862382121562045.7956538857
1441312.16826907961621968.1829564832
1617405.42473351581564134.7088349103
1958064.74206053981838909.7022258686
1196996.68108545941234953.482519236
1970419.05415304032086792.319884533
957806.0026795019983199.6936077191
1318681.04018215041359509.4162058528
2084883.79040242131975825.5125908758
1693384.80306548741670160.8287664847
1562950.3219193831405993.4435541886
1603342.66926748681412911.0303266682
1650269.1798429121642272.114947332
1276987.49196592881214625.6939918217
1406437.68537388741453389.2954357332
1223261.462304811111908.7224308047
1535946.6431138211408639.1995456126
1130844.02936265251293185.515887795
1439028.52098902381419860.3928355142
1462989.49082137431368348.2365172291
1644242.02414953871633269.4321863484
1383651.82707810661246915.0059089526
1910585.05243169911857683.6921985121
1661435.47956720831787172.0366538735
1273308.71027092051113575.1120493454
1578319.89048501341508667.7209129771
1260826.6379971841255808.471882559
1046191.16493699131144973.693078543
1770372.17534404571675447.7656860417
1812209.13661682541832210.7260590754
1566740.1279214271476980.108519712
867444.70486810581074215.180542583
1573105.98114497961648738.542638705
1443842.0226487481366567.6745067732
1177744.97309263591358593.700848612
1838092.1024988641676126.4584647315
1319478.287365451275555.46373587
1246791.02871144071255176.8195105838
1349989.6467284841508569.113530335
1851575.86757861681877234.4359445777
1730103.1331323341737277.2052982477
1189981.40235094731263745.9695143756
1656401.83715276541584944.1613707738
1626941.78786638031497317.3280438608
1787324.50575275461839962.2545173801
1659170.51277537271739209.7540128846
1182887.99732135211228997.028947513
1768705.1252791471661583.6993503189
1641055.93904463881615925.0028348211
1969256.93301589251993352.3070652885
1822438.41990484131839723.5365185086
1454749.80659404371506997.373242388
1153233.24064009381217954.0890334048
1523136.48472094721502550.4885696382
1538903.99254514111687437.2988729598
1791307.24109703021815163.597750282
1788829.2350512041682250.3236752255
1432252.0810739761410354.285142195
1653381.31292399741540095.7665236588
1455325.9995095441511393.6927268123
1573288.81760128591469366.4365734858
1593331.70871016431678568.638991396
1650342.13064280871767906.1577494768
1622827.29784366811466877.6265509701
1166750.31285963841186084.993982749
954114.5439535476895872.3879767852
1224792.3569506851228569.155180695
1228879.86701325141256544.6020417674
1317467.58202264921350820.0774726127
1311654.26289876621300338.219411048
1358983.47047867981310978.274573734
1940225.9075048521725360.3779088715
1495012.96483407661422268.2381222178
1250144.01243897151345857.0266541587
1478028.17399265871446135.9050504742
1630434.84068694941584659.0510528786
1654965.2957120761712060.3889177935
1530172.5248421831570413.43386167
1556256.4374684611535437.7264874051
1504026.26965936271453463.5828914773
1529281.8401193411370920.3548174715
1788515.81761293461811078.7795361793
1065656.02347586261287685.924140165
2017174.98942262631776550.53305854
1541186.25410898941496657.084618771
1689690.7542654261644585.6830045031
1232872.3561714181161106.6640570262
1329800.04619048771328331.0788525972
845890.2405129139972115.8594177873
1630438.85423014571389678.1959715574
1125692.5072952881239116.6604942288
1823498.4068762081921325.3267970905
1401560.91703546771384056.7936268458
1446978.85990438841561916.9484741478
1712929.65433712021772844.1772568794
1326481.67468515091563883.8968491335
1902118.69920367441808441.099156946
2130761.99965768032093901.9504311997
1151006.0775277741305280.3293346493
1957891.5883515421753797.0408798242
1483848.16937597581458319.3024963601
1196204.88626246061195870.8863633932
1890789.17677062471912683.3104675058
1599911.36756483471670386.8863369497
1461511.8812715461540415.2638441804
1571781.5933352041593727.1298392573
1459342.88679856251480986.1109773251
1410814.98469241481342956.3325152015
1476989.18350395191544647.3167039044
1387987.80302448341380958.167112913
1489540.1349032091477104.6398556968
2005037.30667922162072646.6608533394
2294647.783813032244067.504267592
2185480.0906883292049371.4308389444
1699952.81444788281557847.3177530644
1409439.06376516681498265.4480087492
1485418.10226107761666603.6358298268
1458422.81069916981440026.086146546
1689512.17958955891567195.054546874
1267433.90857945061185781.4659106648
1584317.7526927291567760.1751934094
1451739.6246527121267499.5423167613
1183884.0050687621318373.490360009
1770681.13245289731773992.7220420642
1794014.2978549931560625.7519008336
1476386.99627282961435296.012429236
1588549.50073192871691688.159808199
1317167.7132932611313681.7720021228
1569600.4456359481551762.9599420289
1303542.28250807871628680.742679691
1742922.63977118811623864.7500966107
1642051.83170586941544502.8997386517
2330289.7006834392268382.255403579
1735416.92139242941875273.10557363
1620949.43691059551560494.32652517
1796009.50404616381666114.4380031666
1164615.96784251931129000.2236725236
1458009.21052569431351396.8194712778
1619721.71623057761477341.7514588404
1409033.0708875291453396.191812805
1581865.55874732631504003.0981820263
1777009.7121497751787644.9078897508
1877941.97142307411923008.2773280833
1641101.51901315761578412.9325109608
1570583.34033980571771126.0211051414
1551094.81497812221592617.5317832874
1587122.36870816821588543.1291123275
1430796.76256979441551416.4866741942
1480888.80423216151443558.565969536
1739893.55504959681645512.5684583643
1685967.64821564221471707.3290171148
1784057.84315984321681103.9556783568
1921028.56988553282003871.207851706
1558639.88103080381569430.1995234462
1718625.94527457861781502.1916542817
1154917.39361163831246056.922524089
1414286.7244943171505185.7217529546
1437983.82471793261537497.642643035
1273629.12431664761463892.7078892472
1134273.4245214291204919.2121853428
1329007.20344815431368098.0624905406
1211442.94076542931101763.1771893385
855423.9840217031917728.4289651215
1363106.1252824481343120.7009272128
1381536.9339457421509177.240525586
1380602.55558133941296491.3413092163
1444572.97149721371555719.5458229003
2009937.7026284272049076.7833333192
2031338.34697610281978156.853075278
1603075.23661695371565886.7521545514
1975538.41575342161756977.5385309048
2152959.40894308832184512.7854810776
1591203.49005974221547831.9043532321
1381417.24950466261531813.3841167507
1754866.39547832961725066.8392855497
1833208.57915797151789621.546601897
1509968.98457224341576879.8478146922
1749820.01413065921866457.7308937367
1827899.18567648531871540.1956597017
1437053.55720161881334063.1803910122
1532533.61093849321578102.2146284292
1385749.1413486531476261.3717745761
1336743.38339503021331584.9045160739
1616505.35412963851611385.990256331
1543913.43251326731489921.7614128422
1668670.65581209561730528.803825899
1306207.11068295761259498.0909533426
1794214.4247424611738886.678991245
1578766.0499591291457613.360683565
1662494.73554438961741589.2682916308
1801916.34557307261873388.6443247525
1675062.89068712761615257.7032664455
1799455.40609274691815776.7491771337
1404435.5046183931498457.3572949371
1552915.16448986251505547.85235123
1442674.18455225421417129.2342266901
1322439.10755647421343737.7651605476
2249122.5413351932176468.2439735783
910099.64404820371067184.358310631
1545672.116585551502422.073584951
1143621.36025678581278327.6179973707
1599851.89450840981695193.2635664279
2016910.73970732631978888.3366223415
2030910.61534552321976269.9415363586
1455556.46564254681582137.9109921083
1795428.77438979761766569.9423206886
1734239.13835920251663937.5963660134
2096954.04067566132136744.044825644
1495518.623925681214422.715210244
1753967.47659683251693011.6904988252
1778411.6648307461638887.7150634788
1578146.33993395881495588.4348787833
1739628.38266965541763865.3301841728
1698198.75136999881581835.229116695
1501482.2199412621587639.9642715259
1898668.8437144631905165.2317529907
2049146.62989613971855820.236484399
1939603.13090401681872826.076337793
1636559.24060426191538046.1246754774
2138713.9433406352143121.964898102
1454699.23141047061396018.1896457192
1294278.11788509651319651.458045661
1961846.90521894631782647.1956525482
1788285.23899329621803770.1308897594
1557075.42231082921622572.8281961363
1591383.73521999971706367.0607510963
1955253.7114583212026590.208421357
1660295.7959583341588509.9119743267
1842065.95275308871813243.608485571
1419536.25894992241425226.3658138793
1524106.9647214671550233.0576284975
2096977.7901859212075705.4536997452
1528987.32488161021552757.0148513885
1397943.51341572221517385.9300933923
1869886.30526240381798545.5121226395
1205212.29198471571221621.1190695302
1907859.05893150551828327.4627559353
1433006.64542144371473802.0819278397
2033546.78457398972020753.7255111113
1629049.6235192361669075.1884640092
1852338.46924596441794386.0435329732
1340909.79865687181404846.6052138195
1222020.8213359131380492.1332933628
1273518.73676148361284709.3049673783
1421715.41534360751387237.0488583795
1534156.3110801151592892.7008112678
1930143.8312021992017845.541299888
1575680.0369700131461355.3070467082
1647278.6849836651574714.7941408716
1712388.87251830571656141.341347267
1487997.87866332431359879.2142915213
1746086.9889286091775185.8384370692
1442079.05731339381486759.76259168
1842736.24717452911895229.2376090614
2190338.61064854262013828.024828921
1737981.52983559461750971.8395461272
1296636.2710921071396068.6648764126
1810561.1745761951731511.979036742
1792254.81800471181967165.1622805884
1305219.52134910231266925.7579382774
1566471.0083253631672328.503859859
2092949.86134061122116513.9559267676
1609581.80429772941635754.1962271128
1596440.11393600541892819.859490388
1508856.42431474691624157.9168980522
1628878.0938094861606594.3055953393
1872191.54815728431721314.7073658323
1416408.2499208811461062.9079599637
1636996.07360339121463232.8022285663
2173808.6277157382001006.4877878623
1708102.10239872151646117.5201075813
2180065.5977386382248080.496482797
2197436.87549653142091047.7236702004
1876497.26887759521824033.4334195405
2081869.28350286441982562.1321329372
2186194.79257342452164220.300062618
1714055.83680011591679225.5361041287
1813996.93331298461727991.095973719
2106510.8628189442117558.6452341974
1967637.2868223511996119.2632592097
1986811.17019541261951004.0747093838
1902814.52679632811827514.7766946899
2220799.06915616572104586.6788763925
1731437.41599477691797788.8131493004
1053966.42543392841274984.070585235
1899948.05914237841732224.525429096
1808341.46566673411807419.986856441
1642478.7356564441739800.4120310517
1969194.12422382041849831.9549281998
1917583.99861814131963335.6979208784
2275455.3055324372224628.1451242007
2219724.1617930172057112.6450782456
In [0]:
# 评估最佳模型在测试数据上的性能
# 使用 RegressionEvaluator 评估模型在测试数据上的性能
# RegressionEvaluator 使用 r2 作为评估指标
# 这里使用测试数据 predictions 作为输入数据
r2 = RegressionEvaluator(labelCol='label', predictionCol='prediction', metricName='r2')
r2 = r2.evaluate(predictions)
print(f"R^2 fit metric {r2}")
R^2 fit metric 0.9199146361186678
In [0]:
# 实际值与预测值对比图
pdf = predictions.toPandas()
sns.lmplot(data=pdf, x='Price', y='prediction', line_kws={'color': 'red'}, height=5, aspect=1).set(title="Actual vs Predicted")
Out[0]:
<seaborn.axisgrid.FacetGrid at 0x7fbe6b9d3800>
No description has been provided for this image
## CrossValidator 简化了模型比较
- 在数据折叠上运行和测试,以减少模型过度拟合
- 运行模型参数
- 运行多个模型,使用管道作为参数

PySpark Classification¶

In [0]:
%sh
#wget https://raw.githubusercontent.com/nsethi31/Kaggle-Data-Credit-Card-Fraud-Detection/master/creditcard.csv

# credit card fraud detection
# 数据集包含2013年9月欧洲持卡人通过信用卡进行的交易。
# 此数据集显示两天内发生的交易,其中284,807笔交易中有492笔被标记为欺诈。
# 数据集是高度不平衡的,正类(欺诈)占所有交易的0.172%。
# 它只包含作为PCA转换结果的数字输入变量。
# 由于保密问题,未提供有关原始特征和更多背景信息的特征。
# 特征V1、V2、… V28是PCA获得的主要成分,唯一没有通过PCA转换的特征是“时间和“金额”。
# 特征“时间”包含每个事务与数据集中第一个事务之间经过的秒数。
# 特征“金额”是交易金额,此特征可用于示例依赖型成本敏感学习。
# 特征“类”是响应变量,如果出现欺诈则取值1,否则取值0。
In [0]:
# 读取数据
df = spark.read.csv('/FileStore/tables/creditcard.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
cc_fraud = df
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountClass
0.0-1.359807134-0.0727811732.5363467381.378155224-0.338320770.4623877780.2395985540.0986979010.363786970.090794172-0.551599533-0.617800856-0.991389847-0.3111693541.468176972-0.4704005250.2079712420.025790580.403992960.251412098-0.0183067780.277837576-0.110473910.0669280750.128539358-0.1891148440.133558377-0.021053053149.620
0.01.1918571110.2661507120.1664801130.4481540780.060017649-0.082360809-0.0788029830.085101655-0.255425128-0.1669744141.6127266611.0652353110.489095016-0.1437722960.6355580930.463917041-0.114804663-0.18336127-0.145783041-0.069083135-0.225775248-0.6386719530.101288021-0.3398464760.1671704040.125894532-0.0089830990.0147241692.690
In [0]:
# 信用卡欺诈检测
# 导入必要的库
# RFormula: 用于将数据转换为 Spark MLlib 可以使用的格式
# LogisticRegression: 逻辑回归模型,用于二分类问题
# Pipeline: 用于将多个 Spark MLlib 步骤组合成一个工作流
# Model: 用于存储训练好的模型
from pyspark.ml.feature import RFormula
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline, Model

train_data, test_data = cc_fraud.randomSplit([0.6, 0.4], seed=24)

x_cols = list(set(cc_fraud.columns) - {'Class', 'Time', 'weight'})
formula='Class ~ ' + ' + '.join(x_cols)
print("Formula: {}".format(formula))

pipeline = Pipeline(stages=[
    RFormula(formula=formula, featuresCol='features'),
    LogisticRegression()])

fitted_pipeline = pipeline.fit(train_data)
Formula: Class ~ V12 + V3 + V16 + V10 + V25 + V15 + V5 + V22 + V14 + V19 + Amount + V9 + V7 + V6 + V18 + V28 + V11 + V21 + V20 + V4 + V8 + V13 + V1 + V23 + V17 + V2 + V26 + V24 + V27
Downloading artifacts:   0%|          | 0/55 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
In [0]:
# 逻辑回归模型总结
# 从pipeline中检索拟合好的模型
lm = fitted_pipeline.stages[1]
# training summary
print(lm.summary)
print(lm.summary.accuracy)
<pyspark.ml.classification.BinaryLogisticRegressionTrainingSummary object at 0x7f38a4c540e0>
0.9992459976503183
In [0]:
# 分类模型总结

def classification_model_summary(lm, formula, columns):
    print("Classification model summary")
    print(f"Equation\n\t{formula}\n")
    trainingSummary = lm.summary
    accuracy = trainingSummary.accuracy
    falsePositiveRate = trainingSummary.weightedFalsePositiveRate
    truePositiveRate = trainingSummary.weightedTruePositiveRate
    fMeasure = trainingSummary.weightedFMeasure()
    precision = trainingSummary.weightedPrecision
    recall = trainingSummary.weightedRecall
    print(f"Accuracy: {accuracy:.2f} FPR: {falsePositiveRate:.2f} TPR: {truePositiveRate:.2f}")
    print(f"F-measure: {fMeasure:.2f} Precision: {precision:.2f} Recall: {recall:.2f}")
    print(f"{'Labels':>20}")
    print("    "+''.join([f"{l:>10}" for l in lm.summary.labels]))
    print("F-measure"+''.join([f"{l:>10.3f}" for l in lm.summary.fMeasureByLabel()]))
    print("Precision"+''.join([f"{l:>10.3f}" for l in lm.summary.precisionByLabel]))
    print("Recall   "+''.join([f"{l:>10.3f}" for l in lm.summary.recallByLabel]))
classification_model_summary(lm, formula, x_cols)
Classification model summary
Equation
	Class ~ V12 + V3 + V16 + V10 + V25 + V15 + V5 + V22 + V14 + V19 + Amount + V9 + V7 + V6 + V18 + V28 + V11 + V21 + V20 + V4 + V8 + V13 + V1 + V23 + V17 + V2 + V26 + V24 + V27

Accuracy: 1.00 FPR: 0.37 TPR: 1.00
F-measure: 1.00 Precision: 1.00 Recall: 1.00
              Labels
           0.0       1.0
F-measure     1.000     0.738
Precision     0.999     0.897
Recall        1.000     0.628
In [0]:
# BinaryClassificationMetrics: 用于计算二分类指标
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve
import seaborn as sns
from pyspark.mllib.evaluation import BinaryClassificationMetrics
roc_data = lm.summary.roc.select('FPR', 'TPR').toPandas()
plt.figure(figsize=(5,5))
p = sns.lineplot(data=roc_data, x='FPR', y='TPR', linewidth=2)
p.set(xlabel='False Positive Rate', ylabel='True Positive Rate')
p.set(title="ROC Curve")
l1 = p.lines[0]
x1 = l1.get_xydata()[:,0]
y1 = l1.get_xydata()[:,1]
p.fill_between(x1, y1, color="lightblue", alpha=0.3)
plt.plot([0,1], [0,1], linestyle=(0, (5,5)), linewidth=2)
Out[0]:
[<matplotlib.lines.Line2D at 0x7f388054a300>]
No description has been provided for this image
In [0]:
# 使用训练好的模型对训练数据进行预测
predictions = fitted_pipeline.transform(train_data)

# training: Area under precision recall curve (binary classification)
from pyspark.mllib.evaluation import BinaryClassificationMetrics
import matplotlib.pyplot as plt

pr_data = lm.summary.pr.select('recall', 'precision').toPandas()
plt.figure(figsize=(5,5))
p = sns.lineplot(data=pr_data, x='recall', y='precision', linewidth=2)
metrics = BinaryClassificationMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
p.set(title=f"Precision-recall {metrics.areaUnderPR:.3f}")

l1 = p.lines[0]
x1 = l1.get_xydata()[:,0]
y1 = l1.get_xydata()[:,1]
p.fill_between(x1, y1, color="lightblue", alpha=0.3)
plt.plot([0,1], [0,1], linestyle=(0, (5,5)), linewidth=2)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Out[0]:
[<matplotlib.lines.Line2D at 0x7f387c918b90>]
No description has been provided for this image
In [0]:
# Training Confusion matrix
from pyspark.mllib.evaluation import MulticlassMetrics
import pandas as pd
import numpy as np
# 使用 MulticlassMetrics 计算混淆矩阵
# MulticlassMetrics 用于多分类问题的评估
# 混淆矩阵是一个 N x N 的矩阵,其中 N 是类别的数量
# 混淆矩阵的第 i 行第 j 列的值表示真实类别为 i,预测类别为 j 的样本数量
# 这里使用训练数据 predictions 作为输入数据
metrics = MulticlassMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
# 将混淆矩阵转换为 numpy 数组
# metrics.confusionMatrix() 返回的是一个 Matrix 对象,需要使用 toArray() 方法将其转换为 numpy 数组
# 混淆矩阵是一个 N x N 的矩阵,其中 N 是类别的数量
# 混淆矩阵的第 i 行第 j 列的值表示真实类别为 i,预测类别为 j 的样本数量
confusion_matrix = metrics.confusionMatrix().toArray()

cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(5,5))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Out[0]:
[Text(0.5, 24.0, 'Predicted'),
 Text(24.0, 0.5, 'Actual'),
 Text(0.5, 1.0, 'Confusion matrix')]
No description has been provided for this image
In [ ]:
# 使用训练好的模型对测试数据进行预测
# fitted_pipeline.transform(test_data) 方法将测试数据转换为预测数据
# 返回的 predictions 是一个 DataFrame 对象,包含了测试数据和预测结果
# predictions 包含了原始的测试数据,以及新增的 prediction 列,表示模型的预测结果
# predictions 包含了原始的测试数据,以及新增的 probability 列,表示模型预测为每个类别的概率
# predictions 包含了原始的测试数据,以及新增的 rawPrediction 列,表示模型预测的原始输出
predictions = fitted_pipeline.transform(test_data)

from pyspark.mllib.evaluation import MulticlassMetrics

def classification_metrics_summary(predictions, label='label', prediction='prediction'):
    """
    Multi-class classification summary from prediction data
    """
    labels = [row['label'] for row in predictions.select(label).distinct().collect()]
    metrics = MulticlassMetrics(predictions.select(label, prediction).rdd.map(tuple))
    print(f"Classification metrics summary")
    if len(labels) == 2:
        bin_metrics = BinaryClassificationMetrics(predictions.select(label, prediction).rdd.map(tuple))
        areaUnderPR = bin_metrics.areaUnderPR
        areaUnderROC = bin_metrics.areaUnderROC
        print(f"Area under PR: {areaUnderPR}\t Area under ROC: {areaUnderROC}")
    
    accuracy = metrics.accuracy
    falsePositiveRate = metrics.weightedFalsePositiveRate
    truePositiveRate = metrics.weightedTruePositiveRate
    fMeasure = metrics.weightedFMeasure()
    precision = metrics.weightedPrecision
    recall = metrics.weightedRecall
    print(f"Accuracy: {accuracy:.2f} FPR: {falsePositiveRate:.2f} TPR: {truePositiveRate:.2f}")
    print(f"F-measure: {fMeasure:.2f} Precision: {precision:.2f} Recall: {recall:.2f}")
    print(f"{'Labels':>20}")
    print("    "+''.join([f"{l:>10}" for l in labels]))
    print("Precision"+''.join([f"{l:>10.3f}" for l in [metrics.precision(label) for label in labels]]))
    print("Recall   "+''.join([f"{l:>10.3f}" for l in [metrics.recall(label) for label in labels]]))
    
    return metrics.confusionMatrix().toArray()
In [0]:
# 获得预测结果
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Classification metrics summary
Area under PR: 0.590936209296225	 Area under ROC: 0.9321066479080778
Accuracy: 1.00 FPR: 0.13 TPR: 1.00
F-measure: 1.00 Precision: 1.00 Recall: 1.00
              Labels
           0.0       1.0
Precision     1.000     0.634
Recall        0.999     0.865
In [0]:
# 绘制testing混淆矩阵图
cnf_matirx = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(5,5))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
Out[0]:
[Text(0.5, 24.0, 'Predicted'),
 Text(24.0, 0.5, 'Actual'),
 Text(0.5, 1.0, 'Confusion matrix')]
No description has been provided for this image
In [0]:
# multiple class classification
# wget https://raw.githubusercontent.com/daines-analytics/tabular-data-projects/master/r-classification-faulty-steel-plates/faults.csv

# 缺陷数据集
# 该数据集包含有关钢板缺陷的信息。
# 共有7种不同类型的缺陷:
# Pastry, Z_Scratch, K_Scatch, Stains, Dirtiness, Bumps, Other_Faults
# 该数据集包含1941个实例和34个属性。
# 属性包括:
# X_Minimum, X_Maximum, Y_Minimum, Y_Maximum, Pixels_Area, X_Perimeter, Y_Perimeter, Sum_of_Luminosity, Minimum_of_Luminosity, Maximum_of_Luminosity, Length_of_Conveyer, TypeOfSteel_A300, TypeOfSteel_A400, Steel_Plate_Thickness, Edges_Index, Empty_Index, Square_Index, Outside_X_Index, Edges_X_Index, Edges_Y_Index, Outside_Global_Index, LogOfAreas, Log_X_Index, Orientation_Index, Luminosity_Index, SigmoidOfAreas, Pastry, Z_Scratch, K_Scatch, Stains, Dirtiness, Bumps, Other_Faults

In [0]:
# 读取数据
df = spark.read.csv('/FileStore/tables/faults.csv', inferSchema=True, header=True, mode='DROPMALFORMED')
display(df.limit(2))
X_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_LuminosityMaximum_of_LuminosityLength_of_ConveyerTypeOfSteel_A300TypeOfSteel_A400Steel_Plate_ThicknessEdges_IndexEmpty_IndexSquare_IndexOutside_X_IndexEdges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasPastryZ_ScratchK_ScatchStainsDirtinessBumpsOther_Faults
425027090027094426717442422076108168710800.04980.24150.18180.00470.47061.01.02.42650.90311.64350.8182-0.29130.58221000000
6456512538079253810810810301139784123168710800.76470.37930.20690.00360.60.96671.02.03340.77821.46240.7931-0.17560.29841000000
In [0]:
# categories in one column (fault)
# 将多个类别列合并为一个列(fault)
import pyspark.sql.functions as F
dff = df.withColumn('fault',
                    F.when(df.Pastry>0, 'Pastry') \
                        .when(df.Z_Scratch>0, 'Z_Scratch') \
                        .when(df.K_Scatch>0, 'K_Scatch') \
                        .when(df.Stains>0, 'Stains') \
                        .when(df.Dirtiness>0, 'Dirtiness') \
                        .when(df.Bumps>0, 'Bumps') \
                            .otherwise('Other_Fault'))
dff = dff.drop('Pastry').drop('Z_Scratch').drop('K_Scatch').drop('Stains').drop('Dirtiness').drop('Bumps').drop('Other_Faults')
display(dff.limit(2))
X_MinimumX_MaximumY_MinimumY_MaximumPixels_AreasX_PerimeterY_PerimeterSum_of_LuminosityMinimum_of_LuminosityMaximum_of_LuminosityLength_of_ConveyerTypeOfSteel_A300TypeOfSteel_A400Steel_Plate_ThicknessEdges_IndexEmpty_IndexSquare_IndexOutside_X_IndexEdges_X_IndexEdges_Y_IndexOutside_Global_IndexLogOfAreasLog_X_IndexLog_Y_IndexOrientation_IndexLuminosity_IndexSigmoidOfAreasOther_Faultsfault
425027090027094426717442422076108168710800.04980.24150.18180.00470.47061.01.02.42650.90311.64350.8182-0.29130.58220Pastry
6456512538079253810810810301139784123168710800.76470.37930.20690.00360.60.96671.02.03340.77821.46240.7931-0.17560.29840Pastry
In [0]:
# 多个类别的分类
# 缺陷数据集
# 准备数据,将数据集分成训练数据和测试数据
# RFormula: 用于将数据转换为 Spark MLlib 可以使用的格式
# LogisticRegression: 逻辑回归模型,用于多分类问题
# Pipeline: 用于将多个 Spark MLlib 步骤组合成一个工作流
# Model: 用于存储训练好的模型
faults = dff
from pyspark.ml.feature import RFormula
from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline, Model
train_data, test_data = faults.randomSplit([0.6, 0.4], seed=24)
x_cols = list(set(faults.columns) - {'fault'})
formula = "{} ~ {}".format('fault', ' + '.join(x_cols))
print("Formula: {}".format(formula))
pipeline = Pipeline(stages=[
    RFormula(formula=formula),
    LogisticRegression()
])
fitted_model = pipeline.fit(train_data)
Formula: fault ~ Maximum_of_Luminosity + Other_Faults + Square_Index + Pixels_Areas + X_Maximum + Outside_Global_Index + TypeOfSteel_A300 + SigmoidOfAreas + Outside_X_Index + Log_X_Index + X_Perimeter + Length_of_Conveyer + Orientation_Index + Y_Minimum + Sum_of_Luminosity + X_Minimum + Minimum_of_Luminosity + Y_Perimeter + Edges_Index + Steel_Plate_Thickness + Log_Y_Index + Edges_X_Index + Empty_Index + LogOfAreas + Y_Maximum + Edges_Y_Index + TypeOfSteel_A400 + Luminosity_Index
Downloading artifacts:   0%|          | 0/65 [00:00<?, ?it/s]
Uploading artifacts:   0%|          | 0/4 [00:00<?, ?it/s]
In [0]:
# 从pipeline中检索拟合好的模型
# fitted_model.stages 返回的是一个列表,包含了 Pipeline 中的所有模型
# fitted_model.stages[1] 返回的是 Pipeline 中的第二个模型,也就是逻辑回归模型
lm = fitted_model.stages[1]

Training vs testing¶

In [0]:
# 分类模型总结
classification_model_summary(lm, formula, x_cols)
Classification model summary
Equation
	fault ~ Maximum_of_Luminosity + Other_Faults + Square_Index + Pixels_Areas + X_Maximum + Outside_Global_Index + TypeOfSteel_A300 + SigmoidOfAreas + Outside_X_Index + Log_X_Index + X_Perimeter + Length_of_Conveyer + Orientation_Index + Y_Minimum + Sum_of_Luminosity + X_Minimum + Minimum_of_Luminosity + Y_Perimeter + Edges_Index + Steel_Plate_Thickness + Log_Y_Index + Edges_X_Index + Empty_Index + LogOfAreas + Y_Maximum + Edges_Y_Index + TypeOfSteel_A400 + Luminosity_Index

Accuracy: 0.94 FPR: 0.01 TPR: 0.94
F-measure: 0.94 Precision: 0.94 Recall: 0.94
              Labels
           0.0       1.0       2.0       3.0       4.0       5.0       6.0
F-measure     1.000     0.884     0.983     0.886     0.768     1.000     0.831
Precision     1.000     0.878     0.978     0.878     0.797     1.000     0.844
Recall        1.000     0.889     0.987     0.894     0.741     1.000     0.818
In [0]:
# training values
predictions = fitted_model.transform(train_data)
# training: confusion matrix
from pyspark.mllib.evaluation import MulticlassMetrics
import pandas as pd
import numpy as np
metrics = MulticlassMetrics(predictions.select('label', 'prediction').rdd.map(tuple))
confusion_matrix = metrics.confusionMatrix().toArray()
cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(10,7))
sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Out[0]:
[Text(0.5, 24.000000000000007, 'Predicted'),
 Text(24.000000000000007, 0.5, 'Actual'),
 Text(0.5, 1.0, 'Confusion matrix')]
No description has been provided for this image
In [0]:
# testing summary
predictions = fitted_model.transform(test_data)
# model fit with test data
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Classification metrics summary
Accuracy: 0.90 FPR: 0.02 TPR: 0.90
F-measure: 0.90 Precision: 0.90 Recall: 0.90
              Labels
           0.0       1.0       4.0       3.0       2.0       6.0       5.0
Precision     0.993     0.807     0.685     0.870     0.969     0.591     0.917
Recall        1.000     0.823     0.704     0.859     0.908     0.765     0.917
In [0]:
# testing: confusion matrix
cnf_matrix = pd.DataFrame(confusion_matrix)
plt.figure(figsize=(10,7))
p = sns.heatmap(cnf_matrix/np.sum(cnf_matrix), annot=True, cmap='RdBu', fmt='.2%', annot_kws={'fontsize': 10})
p.set(xlabel='Predicted', ylabel='Actual', title="Confusion matrix")
Out[0]:
[Text(0.5, 47.7222222222222, 'Predicted'),
 Text(95.72222222222221, 0.5, 'Actual'),
 Text(0.5, 1.0, 'Confusion matrix')]
No description has been provided for this image
In [0]:
# testing summary
predictions = fitted_model.transform(test_data)
confusion_matrix = classification_metrics_summary(predictions)
/databricks/spark/python/pyspark/sql/context.py:165: FutureWarning: Deprecated in 3.0.0. Use SparkSession.builder.getOrCreate() instead.
  warnings.warn(
Classification metrics summary
Accuracy: 0.90 FPR: 0.02 TPR: 0.90
F-measure: 0.90 Precision: 0.90 Recall: 0.90
              Labels
           0.0       1.0       4.0       3.0       2.0       6.0       5.0
Precision     0.993     0.807     0.685     0.870     0.969     0.591     0.917
Recall        1.000     0.823     0.704     0.859     0.908     0.765     0.917

Databricks PySpark vs PySpark¶

  • Databricks PySpark ≠ 纯开源 PySpark。Databricks Runtime(DBR)在开源 Spark 之上加了很多“魔法”和预装生态(Delta Lake、dbutils、Auto Loader、MLflow 集成、云存储连接器、Hive/UC 配置等)。
  • 将这个课件的代码直接拿到本地 PySpark 运行,会报错请纠正。
  • 本地PySpark环境搭建(https://kdding.github.io/books/data_analysis_slides/pyspark.html%EF%BC%89
  • 该任务的第一个代码块内容如后一页课件所示
In [ ]:
import psutil
import platform
import os
env_name = os.environ.get('CONDA_DEFAULT_ENV')
print("当前 conda 环境名:", env_name)
print(platform.system()) # 操作系统名称
print(platform.release()) # 操作系统版本
print(platform.machine()) # 计算机架构
print(platform.processor()) # 处理器类型
# CPU 信息
print(psutil.cpu_count()) # CPU 核数
print(psutil.cpu_freq()) # CPU 频率
# 内存信息
print(psutil.virtual_memory()) # 内存总量、可用内存、已用内存等