Professional Documents
Culture Documents
Apuntes Azure Data Scientist
Apuntes Azure Data Scientist
A significant part of a a data scientist's role is to explore, analyze, and visualize data.
There are many tools and programming languages that they can use to do this. One
of the most popular approaches is to use Jupyter notebooks (like this one) and
Python.
In this notebook, we'll explore some of these packages and apply basic techniques
to analyze data. This is not intended to be a comprehensive Python programming
exercise or even a deep dive into data analysis. Rather, it's intended as a crash
course in some of the common ways in which data scientists can use Python to
work with data.
Note: If you've never used the Jupyter Notebooks environment before, there are a few
things you should be aware of:
● Notebooks are made up of cells. Some cells (like this one) contain
markdown text, while others (like the one beneath this one) contain
code.
● You can run each code cell by using the ► Run button. The ► Run
button will show up when you hover over the cell.
● The output from each code cell will be displayed immediately below the
cell.
● Even though the code cells can be run individually, some variables used
in the code are global to the notebook. That means that you should run
all of the code cells in order. There may be dependencies between code
cells, so if you skip a cell, subsequent cells might not run correctly.
Run the code in the cell below by clicking the ► Run button to see the data.
data =
[50,50,47,97,49,3,53,42,26,74,82,62,37,15,70,27,36,35,48,52,63,64]
print(data)
The data has been loaded into a Python list structure, which is a good data type for
general data manipulation, but it's not optimized for numeric analysis. For that, we're
going to use the NumPy package, which includes specific data types and functions
for working with Numbers in Python.
Run the cell below to load the data into a NumPy array.
import numpy as np
grades = np.array(data)
print(grades)
Just in case you're wondering about the differences between a list and a NumPy
array, let's compare how these data types behave when we use them in an
expression that multiplies them by 2.
print (type(data),'x 2:', data * 2)
print('---')
print (type(grades),'x 2:', grades * 2)
Note that multiplying a list by 2 creates a new list of twice the length with the original
sequence of list elements repeated. Multiplying a NumPy array on the other hand
performs an element-wise calculation in which the array behaves like a vector, so we
end up with an array of the same size in which each element has been multiplied by
2.
The key takeaway from this is that NumPy arrays are specifically designed to support
mathematical operations on numeric data—which makes them more useful for data
analysis than a generic list.
You might have spotted that the class type for the NumPy array above is a
numpy.ndarray. The nd indicates that this is a structure that can consist of multiple
dimensions. (It can have n dimensions.) Our specific instance has a single dimension
of student grades.
You can apply aggregations across the elements in the array, so let's find the simple
average grade (in other words, the mean grade value).
grades.mean()
So the mean grade is just around 50—more or less in the middle of the possible
range from 0 to 100.
Let's add a second set of data for the same students. This time, we'll record the
typical number of hours per week they devoted to studying.
# Define an array of study hours
study_hours = [10.0,11.5,9.0,16.0,9.25,1.0,11.5,9.0,8.5,14.5,15.5,
13.75,9.0,8.0,15.5,8.0,9.0,6.0,10.0,12.0,12.5,12.0]
# Create a 2D array (an array of arrays)
student_data = np.array([study_hours, grades])
# display the array
student_data
Now the data consists of a 2-dimensional array—an array of arrays. Let's look at its
shape.
# Show shape of 2D array
student_data.shape
The student_data array contains two elements, each of which is an array containing
22 elements.
To navigate this structure, you need to specify the position of each element in the
hierarchy. So to find the first value in the first array (which contains the study hours
data), you can use the following code.
# Show the first element of the first element
student_data[0][0]
Now you have a multidimensional array containing both the student's study time and
grade information, which you can use to compare study time to a student's grade.
# Get the mean value of each sub-array
avg_study = student_data[0].mean()
avg_grade = student_data[1].mean()
print('Average study hours: {:.2f}\nAverage grade:
{:.2f}'.format(avg_study, avg_grade))
Run the following cell to import the Pandas library and create a DataFrame with three
columns. The first column is a list of student names, and the second and third
columns are the NumPy arrays containing the study time and grade data.
import pandas as pd
df_students = pd.DataFrame({'Name': ['Dan', 'Joann', 'Pedro', 'Rosie',
'Ethan', 'Vicky', 'Frederic', 'Jimmie',
'Rhonda', 'Giovanni', 'Francesca',
'Rajab', 'Naiyana', 'Kian', 'Jenny',
'Jakeem','Helena','Ismat','Anila','Skye','Daniel','Aisha'],
'StudyHours':student_data[0],
'Grade':student_data[1]})
df_students
Note that in addition to the columns you specified, the DataFrame includes an index
to uniquely identify each row. We could have specified the index explicitly and
assigned any kind of appropriate value (for example, an email address). However,
because we didn't specify an index, one has been created with a unique integer value
for each row.
The loc method returned rows with index label in the list of values from 0 to 5, which
includes 0, 1, 2, 3, 4, and 5 (six rows). However, the iloc method returns the rows in
the positions included in the range 0 to 5. Since integer ranges don't include the
upper-bound value, this includes positions 0, 1, 2, 3, and 4 (five rows).
iloc identifies data values in a DataFrame by position, which extends beyond rows to
columns. So, for example, you can use it to find the values for the columns in
positions 1 and 2 in row 0, like this:
df_students.iloc[0,[1,2]]
Let's return to the loc method, and see how it works with columns. Remember that
loc is used to locate data items based on index values rather than positions. In the
absence of an explicit index column, the rows in our DataFrame are indexed as
integer values, but the columns are identified by name:
df_students.loc[0,'Grade']
Here's another useful trick. You can use the loc method to find indexed rows based
on a filtering expression that references named columns other than the index, like
this:
df_students.loc[df_students['Name']=='Aisha']
Actually, you don't need to explicitly use the loc method to do this. You can simply
apply a DataFrame filtering expression, like this:
df_students[df_students['Name']=='Aisha']
And for good measure, you can achieve the same results by using the DataFrame's
query method, like this:
df_students.query('Name=="Aisha"')
The three previous examples underline a confusing truth about working with Pandas.
Often, there are multiple ways to achieve the same results. Another example of this
is the way you refer to a DataFrame column name. You can specify the column name
as a named index value (as in the df_students['Name'] examples we've seen so
far), or you can use the column as a property of the DataFrame, like this:
df_students[df_students.Name == 'Aisha']
To see them in context, we can filter the DataFrame to include only rows where any
of the columns (axis 1 of the DataFrame) are null.
df_students[df_students.isnull().any(axis=1)]
When the DataFrame is retrieved, the missing numeric values show up as NaN (not a
number).
So now that we've found the null values, what can we do about them?
One common approach is to impute replacement values. For example, if the number
of study hours is missing, we could just assume that the student studied for an
average amount of time and replace the missing value with the mean study hours. To
do this, we can use the fillna method like this:
df_students.StudyHours =
df_students.StudyHours.fillna(df_students.StudyHours.mean())
df_students
Alternatively, it might be important to ensure that you only use data you know to be
absolutely correct. In this case, you can drop rows or columns that contain null
values by using the dropna method. For example, we'll remove rows (axis 0 of the
DataFrame) where any of the columns contain null values:
df_students = df_students.dropna(axis=0, how='any')
df_students
Explore data in the DataFrame
Now that we've cleaned up the missing values, we're ready to explore the data in the
DataFrame. Let's start by comparing the mean study hours and grades.
# Get the mean study hours using to column name as an index
mean_study = df_students['StudyHours'].mean()
# Get the mean grade using the column name as a property (just to make
the point!)
mean_grade = df_students.Grade.mean()
# Print the mean study hours and mean grade
print('Average weekly study hours: {:.2f}\nAverage grade:
{:.2f}'.format(mean_study, mean_grade))
OK, let's filter the DataFrame to find only the students who studied for more than the
average amount of time.
# Get students who studied for the mean or more hours
df_students[df_students.StudyHours > mean_study]
Note that the filtered result is itself a DataFrame, so you can work with its columns
just like any other DataFrame.
For example, let's find the average grade for students who undertook more than the
average amount of study time.
# What was their mean grade?
df_students[df_students.StudyHours > mean_study].Grade.mean()
Let's assume that the passing grade for the course is 60.
We can use that information to add a new column to the DataFrame that indicates
whether or not each student passed.
First, we'll create a Pandas Series containing the pass/fail indicator (True or False),
and then we'll concatenate that series as a new column (axis 1) in the DataFrame.
passes = pd.Series(df_students['Grade'] >= 60)
df_students = pd.concat([df_students, passes.rename("Pass")], axis=1)
df_students
DataFrames are designed for tabular data, and you can use them to perform many of
the same kinds of data analytics operations you can do in a relational database, such
as grouping and aggregating tables of data.
For example, you can use the groupby method to group the student data into groups
based on the Pass column you added previously and to count the number of names
in each group. In other words, you can determine how many students passed and
failed.
print(df_students.groupby(df_students.Pass).Name.count())
You can aggregate multiple fields in a group using any available aggregation
function. For example, you can find the mean study time and grade for the groups of
students who passed and failed the course.
print(df_students.groupby(df_students.Pass)['StudyHours',
'Grade'].mean())
DataFrames are amazingly versatile and make it easy to manipulate data. Many
DataFrame operations return a new copy of the DataFrame. So if you want to modify
a DataFrame but keep the existing variable, you need to assign the result of the
operation to the existing variable. For example, the following code sorts the student
data into descending order by Grade and assigns the resulting sorted DataFrame to
the original df_students variable.
# Create a DataFrame with the data sorted by Grade (descending)
df_students = df_students.sort_values('Grade', ascending=False)
# Show the DataFrame
df_students
Summary
NumPy and DataFrames are the workhorses of data science in Python. They provide
us ways to load, explore, and analyze tabular data. As we will see in subsequent
modules, even advanced analysis methods typically rely on NumPy and Pandas for
these important roles.
In our next workbook, we'll take a look at how create graphs and explore your data in
more interesting ways.
Exploring data with Python -
visualize data
In this notebook, we'll apply a few techniques to analyze data with basic statistics
and visualize it using graphs.
Run the code in the cell below by clicking the ► Run button to see the data.
import pandas as pd
# Load data from a text file
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/grades.csv
df_students = pd.read_csv('grades.csv',delimiter=',',header='infer')
# Remove any rows with missing data
df_students = df_students.dropna(axis=0, how='any')
# Calculate who passed, assuming '60' is the grade needed to pass
passes = pd.Series(df_students['Grade'] >= 60)
# Save who passed to the Pandas dataframe
df_students = pd.concat([df_students, passes.rename("Pass")], axis=1)
# Print the result out into this notebook
df_students
Let's start with a simple bar chart that shows the grade of each student.
Note: This first graph may take 1 to 2 minutes to render. Subsequent graphs will
render more quickly.
# Ensure plots are displayed inline in the notebook
%matplotlib inline
from matplotlib import pyplot as plt
# Create a bar plot of name vs grade
plt.bar(x=df_students.Name, height=df_students.Grade)
# Display the plot
plt.show()
Well, that worked, but the chart could use some improvements to make it clearer
what we're looking at.
Note that you used the pyplot class from Matplotlib to plot the chart. This class
provides many ways to improve the visual elements of the plot. For example, the
following code:
Resultado:
A plot is technically contained within a Figure. In the previous examples, the figure
was created implicitly for you, but you can create it explicitly. For example, the
following code creates a figure with a specific size.
# Create a Figure
fig = plt.figure(figsize=(8,3))
# Create a bar plot of name vs grade
plt.bar(x=df_students.Name, height=df_students.Grade, color='orange')
# Customize the chart
plt.title('Student Grades')
plt.xlabel('Student')
plt.ylabel('Grade')
plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y',
alpha=0.7)
plt.xticks(rotation=90)
# Show the figure
plt.show()
For example, the following code creates a figure with two subplots: one is a bar chart
showing student grades, and the other is a pie chart comparing the number of
passing grades to non-passing grades.
# Create a figure for 2 subplots (1 row, 2 columns)
fig, ax = plt.subplots(1, 2, figsize = (10,4))
# Create a bar plot of name vs grade on the first axis
ax[0].bar(x=df_students.Name, height=df_students.Grade, color='orange')
ax[0].set_title('Grades')
ax[0].set_xticklabels(df_students.Name, rotation=90)
# Create a pie chart of pass counts on the second axis
pass_counts = df_students['Pass'].value_counts()
ax[1].pie(pass_counts, labels=pass_counts)
ax[1].set_title('Passing Grades')
ax[1].legend(pass_counts.keys().tolist())
# Add a title to the Figure
fig.suptitle('Student Data')
# Show the figure
fig.show()
Resultado:
Until now, you've used methods of the Matplotlib.pyplot object to plot charts.
However, Matplotlib is so foundational to graphics in Python that many packages,
including Pandas, provide methods that abstract the underlying Matplotlib functions
and simplify plotting. For example, the DataFrame provides its own methods for
plotting data as shown in the following example, which plots a bar chart of study
hours.
df_students.plot.bar(x='Name', y='StudyHours', color='teal',
figsize=(6,4))
A lot of data science is rooted in statistics, so we'll explore some basic statistical
techniques.
Note: This section is not intended to teach you statistics—that's much too big a topic
for this notebook. It will however introduce you to some statistical concepts and
techniques that data scientists use as they explore data in preparation for machine
learning modeling.
● The mean: A simple average based on adding together all of the values in the
sample set and then dividing the total by the number of samples.
● The median: The value in the middle of the range of all of the sample values.
● The mode: The most commonly occurring value in the sample set*.
Let's calculate these values, along with the minimum and maximum values for
comparison, and show them on the histogram.
*Of course, in some sample sets, there may be a tie for the most common value. In
those cases, the dataset is described as bimodal or even multimodal.
# Get the variable to examine
var = df_students['Grade']
# Get statistics
min_val = var.min()
max_val = var.max()
mean_val = var.mean()
med_val = var.median()
mod_val = var.mode()[0]
print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMaximum
:{:.2f}\n'.format(min_val,
mean_val,
med_val,
mod_val,
max_val))
# Create a Figure
fig = plt.figure(figsize=(10,4))
# Plot a histogram
plt.hist(var)
# Add lines for the statistics
plt.axvline(x=min_val, color = 'gray', linestyle='dashed', linewidth =
2)
plt.axvline(x=mean_val, color = 'cyan', linestyle='dashed', linewidth =
2)
plt.axvline(x=med_val, color = 'red', linestyle='dashed', linewidth =
2)
plt.axvline(x=mod_val, color = 'yellow', linestyle='dashed', linewidth
= 2)
plt.axvline(x=max_val, color = 'gray', linestyle='dashed', linewidth =
2)
# Add titles and labels
plt.title('Data Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
# Show the figure
fig.show()
Resultado:
For the grade data, the mean, median, and mode all seem to be more or less in the
middle of the minimum and maximum, at around 50.
Another way to visualize the distribution of a variable is to use a box plot (sometimes
called a box-and-whiskers plot). Let's create one for the grade data.
# Get the variable to examine
var = df_students['Grade']
# Create a Figure
fig = plt.figure(figsize=(10,4))
# Plot a histogram
plt.boxplot(var)
# Add titles and labels
plt.title('Data Distribution')
# Show the figure
fig.show()
Resultado:
The box plot shows the distribution of the grade values in a format different from the
histogram. The box part of the plot shows where the inner two quartiles of the data
reside. In this case, half of the grades are between approximately 36 and 63. The
whiskers extending from the box show the outer two quartiles, so the other half of
the grades in this case are between 0 and 36 or 63 and 100. The line in the box
indicates the median value.
For learning, it can be useful to combine histograms and box plots, with the box
plot's orientation changed to align it with the histogram. (In some ways, it can be
helpful to think of the histogram as a "front elevation" view of the distribution, and the
box plot as a "plan" view of the distribution from above.)
# Create a function that we can re-use
def show_distribution(var_data):
from matplotlib import pyplot as plt
# Get statistics
min_val = var_data.min()
max_val = var_data.max()
mean_val = var_data.mean()
med_val = var_data.median()
mod_val = var_data.mode()[0]
print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMaximum
:{:.2f}\n'.format(min_val,
mean_val,
med_val,
mod_val,
max_val))
# Create a figure for 2 subplots (2 rows, 1 column)
fig, ax = plt.subplots(2, 1, figsize = (10,4))
# Plot the histogram
ax[0].hist(var_data)
ax[0].set_ylabel('Frequency')
# Add lines for the mean, median, and mode
ax[0].axvline(x=min_val, color = 'gray', linestyle='dashed',
linewidth = 2)
ax[0].axvline(x=mean_val, color = 'cyan', linestyle='dashed',
linewidth = 2)
ax[0].axvline(x=med_val, color = 'red', linestyle='dashed',
linewidth = 2)
ax[0].axvline(x=mod_val, color = 'yellow', linestyle='dashed',
linewidth = 2)
ax[0].axvline(x=max_val, color = 'gray', linestyle='dashed',
linewidth = 2)
# Plot the boxplot
ax[1].boxplot(var_data, vert=False)
ax[1].set_xlabel('Value')
# Add a title to the Figure
fig.suptitle('Data Distribution')
# Show the figure
fig.show()
# Get the variable to examine
col = df_students['Grade']
# Call the function
show_distribution(col)
Resultado:
All of the measurements of central tendency are right in the middle of the data
distribution, which is symmetric with values becoming progressively lower in both
directions from the middle.
To explore this distribution in more detail, you need to understand that statistics is
fundamentally about taking samples of data and using probability functions to
extrapolate information about the full population of data.
What does this mean? Samples refer to the data we have on hand, such as
information about these 22 students' study habits and grades. The population refers
to all possible data we could collect, such as every student's grades and study habits
across every educational institution throughout the history of time. Usually we're
interested in the population, but it's simply not practical to collect all of that data.
Instead, we need to try estimate what the population is like from the small amount of
data (samples) that we have.
The pyplot class from Matplotlib provides a helpful plot function to show this
density.
def show_density(var_data):
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(10,4))
# Plot density
var_data.plot.density()
# Add titles and labels
plt.title('Data Density')
# Show the mean, median, and mode
plt.axvline(x=var_data.mean(), color = 'cyan', linestyle='dashed',
linewidth = 2)
plt.axvline(x=var_data.median(), color = 'red', linestyle='dashed',
linewidth = 2)
plt.axvline(x=var_data.mode()[0], color = 'yellow',
linestyle='dashed', linewidth = 2)
# Show the figure
plt.show()
# Get the density of Grade
col = df_students['Grade']
show_density(col)
As expected from the histogram of the sample, the density shows the characteristic
"bell curve" of what statisticians call a normal distribution with the mean and mode
at the center and symmetric tails.
Summary
Well done! There were a number of new concepts in here, so let's summarize.
Here we have:
In our next notebook, we'll look at spotting unusual data and finding relationships
between data.
Exploring data with Python - real
world data
In the last notebook, we looked at grades for our student data and investigated the
data visually with histograms and box plots. Now we'll look into more complex cases,
describe the data more fully, and discuss how to make basic comparisons between
data.
Run the code below to print out the data and make a histogram + box plot that shows
the grades for our sample of students.
import pandas as pd
from matplotlib import pyplot as plt
# Load data from a text file
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/grades.csv
df_students = pd.read_csv('grades.csv',delimiter=',',header='infer')
# Remove any rows with missing data
df_students = df_students.dropna(axis=0, how='any')
# Calculate who passed, assuming '60' is the grade needed to pass
passes = pd.Series(df_students['Grade'] >= 60)
# Save who passed to the Pandas dataframe
df_students = pd.concat([df_students, passes.rename("Pass")], axis=1)
# Print the result out into this notebook
print(df_students)
#·
Create·
a·
function·
that·we·can·re-use
def·
show_distribution(var_data):
····'
''
····T
his·
function·
will·
make·a·
distribution·(graph)·and·
display·it
····'
''
····#
·Get·
statistics
····m
in_val·=·
var_data.min()
····m
ax_val·=·
var_data.max()
····m
ean_val·=·
var_data.mean()
····m
ed_val·=·
var_data.median()
····m
od_val·=·
var_data.mode()[0]
····p
rint('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\nMax
imum:{:.2f}\n'.format(min_val,
·····················································································
·······m ean_val,
·····················································································
·······m ed_val,
·····················································································
·······m od_val,
·····················································································
·······m ax_val))
····#
·Create·
a·
figure·for·2·subplots·
(2·rows,·1·
column)
····f
ig,·ax·=·
plt.subplots(2,·
1,·figsize·=·(10,4))
····#
·Plot·the·
histogram···
····a
x[0].hist(var_data)
····a
x[0].set_ylabel('Frequency')
····#
·Add·
lines·
for·
the·mean,·
median,·and·mode
····a
x[0].axvline(x=min_val,·color·=·
'gray',·
linestyle='dashed',·linewi
dth·=· 2)
····a
x[0].axvline(x=mean_val,·
color·=·
'cyan',·linestyle='dashed',·
linew
idth·=· 2)
····a
x[0].axvline(x=med_val,·color·=·
'red',·
linestyle='dashed',·linewid
th·=·2)
····a
x[0].axvline(x=mod_val,·color·=·
'yellow',·linestyle='dashed',·
line
width·=·2)
····a
x[0].axvline(x=max_val,·color·=·
'gray',·
linestyle='dashed',·linewi
dth·=· 2)
····#
·Plot·the·
boxplot···
····a
x[1].boxplot(var_data,·
vert=False)
····a
x[1].set_xlabel('Value')
····#
·Add·
a·
title·
to·the·Figure
····f
ig.suptitle('Data·
Distribution')
····#
·Show·the·
figure
····f
ig.show()
show_distribution(df_students['Grade'])
As you might recall, our data had the mean and mode at the center, with data spread
symmetrically from there.
Now let's take a look at the distribution of the study hours data.
#·
Get·
the·
variable·to·examine
col·=·
df_students['StudyHours']
#·
Call·
the·
function
show_distribution(col)
Resultado:
The distribution of the study time data is significantly different from that of the
grades.
Note that the whiskers of the box plot only begin at around 6.0, indicating that the
vast majority of the first quarter of the data is above this value. The minimum is
marked with an o, indicating that it is statistically an outlier—a value that lies
significantly outside the range of the rest of the distribution.
Outliers can occur for many reasons. Maybe a student meant to record "10" hours of
study time, but entered "1" and missed the "0". Or maybe the student was abnormally
lazy when it comes to studying! Either way, it's a statistical anomaly that doesn't
represent a typical student. Let's see what the distribution looks like without it.
# Get the variable to examine
# We will only get students who have studied more than one hour
col = df_students[df_students.StudyHours>1]['StudyHours']
# Call the function
show_distribution(col)
Resultado:
For learning purposes, we have just treated the value 1 as a true outlier here and
excluded it. In the real world, it would be unusual to exclude data at the extremes
without more justification when our sample size is so small. This is because the
smaller our sample size, the more likely it is that our sampling is a bad
representation of the whole population. (Here, the population means grades for all
students, not just our 22.) For example, if we sampled study time for another 1,000
students, we might find that it's actually quite common to not study much!
When we have more data available, our sample becomes more reliable. This makes it
easier to consider outliers as being values that fall below or above percentiles within
which most of the data lie. For example, the following code uses the Pandas quantile
function to exclude observations below the 0.01th percentile (the value above which
99% of the data reside).
# calculate the 0.01th percentile
q01 = df_students.StudyHours.quantile(0.01)
# Get the variable to examine
col = df_students[df_students.StudyHours>q01]['StudyHours']
# Call the function
show_distribution(col)
Resultado:
Tip: You can also eliminate outliers at the upper end of the distribution by defining a
threshold at a high percentile value. For example, you could use the quantile function
to find the 0.99 percentile below which 99% of the data reside.
With the outliers removed, the box plot shows all data within the four quartiles. Note
that the distribution is not symmetric like it is for the grade data. There are some
students with very high study times of around 16 hours, but the bulk of the data is
between 7 and 13 hours. The few extremely high values pull the mean towards the
higher end of the scale.
Resultado:
This kind of distribution is called right skewed. The mass of the data is on the left
side of the distribution, creating a long tail to the right because of the values at the
extreme high end, which pull the mean to the right.
Measures of variance
So now we have a good idea where the middle of the grade and study hours data
distributions are. However, there's another aspect of the distributions we should
examine: how much variability is there in the data?
When working with a normal distribution, the standard deviation works with the
particular characteristics of a normal distribution to provide even greater insight. Run
the cell below to see the relationship between standard deviations and the data in
the normal distribution.
import scipy.stats as stats
# Get the Grade column
col = df_students['Grade']
# get the density
density = stats.gaussian_kde(col)
# Plot the density
col.plot.density()
# Get the mean and standard deviation
s = col.std()
m = col.mean()
# Annotate 1 stdev
x1 = [m-s, m+s]
y1 = density(x1)
plt.plot(x1,y1, color='magenta')
plt.annotate('1 std (68.26%)', (x1[1],y1[1]))
# Annotate 2 stdevs
x2 = [m-(s*2), m+(s*2)]
y2 = density(x2)
plt.plot(x2,y2, color='green')
plt.annotate('2 std (95.45%)', (x2[1],y2[1]))
# Annotate 3 stdevs
x3 = [m-(s*3), m+(s*3)]
y3 = density(x3)
plt.plot(x3,y3, color='orange')
plt.annotate('3 std (99.73%)', (x3[1],y3[1]))
# Show the location of the mean
plt.axvline(col.mean(), color='cyan', linestyle='dashed', linewidth=1)
plt.axis('off')
plt.show()
Resultado:
The horizontal lines show the percentage of data within 1, 2, and 3 standard
deviations of the mean (plus or minus).
● Approximately 68.26% of values fall within one standard deviation from the
mean.
● Approximately 95.45% of values fall within two standard deviations from the
mean.
● Approximately 99.73% of values fall within three standard deviations from the
mean.
So, since we know that the mean grade is 49.18, the standard deviation is 21.74, and
distribution of grades is approximately normal, we can calculate that 68.26% of
students should achieve a grade between 27.44 and 70.92.
The descriptive statistics we've used to understand the distribution of the student
data variables are the basis of statistical analysis. Because they're such an
important part of exploring your data, there's a built-in describe method of the
DataFrame object that returns the main descriptive statistics for all numeric
columns.
df_students.describe()
Comparing data
Now that you know something about the statistical distribution of the data in your
dataset, you're ready to examine your data to identify any apparent relationships
between variables.
First of all, let's get rid of any rows that contain outliers so that we have a sample
that is representative of a typical class of students. We identified that the
StudyHours column contains some outliers with extremely low values, so we'll
remove those rows.
df_sample = df_students[df_students['StudyHours']>1]
df_sample
To make this comparison, let's create box plots showing the distribution of
StudyHours for each possible Pass value (true and false).
df_sample.boxplot(column='StudyHours', by='Pass', figsize=(8,5))
Comparing the StudyHours distributions, it's immediately apparent (if not particularly
surprising) that students who passed the course tended to study for more hours than
students who didn't. So if you wanted to predict whether or not a student is likely to
pass the course, the amount of time they spend studying may be a good predictive
indicator.
Resultado:
The chart shows bars for both grade and study hours for each student, but it's not
easy to compare because the values are on different scales. A grade is measured in
grade points (and ranges from 3 to 97), and study time is measured in hours (and
ranges from 1 to 16).
Resultado
With the data normalized, it's easier to see an apparent relationship between grade
and study time. It's not an exact match, but it definitely seems like students with
higher grades tend to have studied more.
So there seems to be a correlation between study time and grade. In fact, there's a
statistical correlation measurement we can use to quantify the relationship between
these columns.
df_normalized.Grade.corr(df_normalized.StudyHours)
The correlation statistic is a value between -1 and 1 that indicates the strength of a
relationship. Values above 0 indicate a positive correlation (high values of one
variable tend to coincide with high values of the other), while values below 0 indicate
a negative correlation (high values of one variable tend to coincide with low values of
the other). In this case, the correlation value is close to 1, showing a strongly positive
correlation between study time and grade.
Note: Data scientists often quote the maxim "correlation is not causation". In other
words, as tempting as it might be, you shouldn't interpret the statistical correlation as
explaining why one of the values is high. In the case of the student data, the
statistics demonstrate that students with high grades tend to also have high
amounts of study time, but this is not the same as proving that they achieved high
grades because they studied a lot. The statistic could equally be used as evidence to
support the nonsensical conclusion that the students studied a lot because their
grades were going to be high.
Another way to visualize the apparent correlation between two numeric columns is
to use a scatter plot.
# Create a scatter plot
df_sample.plot.scatter(title='Study Time vs Grade', x='StudyHours',
y='Grade')
Again, it looks like there's a discernible pattern in which the students who studied the
most hours are also the students who got the highest grades.
We can see this more clearly by adding a regression line (or a line of best fit) to the
plot that shows the general trend in the data. To do this, we'll use a statistical
technique called least squares regression.
Remember when you were learning how to solve linear equations in school, and
recall that the slope-intercept form of a linear equation looks like this:
�=��+�
In this equation, y and x are the coordinate variables, m is the slope of the line, and b
is the y-intercept (where the line goes through the Y-axis).
In the case of our scatter plot for our student data, we already have our values for x
(StudyHours) and y (Grade), so we just need to calculate the intercept and slope of
the straight line that lies closest to those points. Then we can form a linear equation
that calculates a new y value on that line for each of our x (StudyHours) values. To
avoid confusion, we'll call this new y value f(x) (because it's the output from a linear
equation function based on x). The difference between the original y (Grade) value
and the f(x) value is the error between our regression line and the actual Grade
achieved by the student. Our goal is to calculate the slope and intercept for a line
with the lowest overall error.
Specifically, we define the overall error by taking the error for each point, squaring it,
and adding all the squared errors together. The line of best fit is the line that gives us
the lowest value for the sum of the squared errors—hence the name least squares
regression.
Fortunately, you don't need to code the regression calculation yourself. The SciPy
package includes a stats class that provides a linregress method to do the hard work
for you. This returns (among other things) the coefficients you need for the slope
equation: slope (m) and intercept (b) based on a given pair of variable samples you
want to compare.
from scipy import stats
#
df_regression = df_sample[['Grade', 'StudyHours']].copy()
# Get the regression slope and intercept
m, b, r, p, se = stats.linregress(df_regression['StudyHours'],
df_regression['Grade'])
print('slope: {:.4f}\ny-intercept: {:.4f}'.format(m,b))
print('so...\n f(x) = {:.4f}x + {:.4f}'.format(m,b))
# Use the function (mx + b) to calculate f(x) for each x (StudyHours)
value
df_regression['fx'] = (m * df_regression['StudyHours']) + b
# Calculate the error between f(x) and the actual y (Grade) value
df_regression['error'] = df_regression['fx'] - df_regression['Grade']
# Create a scatter plot of Grade vs StudyHours
df_regression.plot.scatter(x='StudyHours', y='Grade')
# Plot the regression line
plt.plot(df_regression['StudyHours'],df_regression['fx'], color='cyan')
# Display the plot
plt.show()
Resultado
Note that this time, the code plotted two distinct things—the scatter plot of the
sample study hours and grades is plotted as before, and then a line of best fit based
on the least squares regression coefficients is plotted.
The slope and intercept coefficients calculated for the regression line are shown
above the plot.
The line is based on the f(x) values calculated for each StudyHours value. Run the
following cell to see a table that includes the following values:
Some of the errors, particularly at the extreme ends, and quite large (up to over 17.5
grade points). But, in general, the line is pretty close to the actual grades.
# Show the original x,y values, the f(x) value, and the error
df_regression[['StudyHours', 'Grade', 'fx', 'error']]
This technique is in fact the basic premise of machine learning. You can take a set of
sample data that includes one or more features (in this case, the number of hours
studied) and a known label value (in this case, the grade achieved) and use the
sample data to derive a function that calculates predicted label values for any given
set of features.
Summary
Here we've looked at:
100 XP
2 minutos
Requisitos previos
● Conocimientos de matemáticas básicas
● Experiencia previa con la programación en Python
Objetivos de aprendizaje
Objetivos de este módulo:
¿Qué es la regresión?
Completado
100 XP
8 minutos
La regresión consiste en establecer una relación entre las variables de los datos que
representan propiedades (conocidas como características) de lo que se está
observando y la variable que se está intentando predecir (conocida como etiqueta).
Recuerde nuestra empresa que alquila bicicletas y quiere predecir el número
esperado de alquileres en un día determinado. En este caso, las características
incluyen cosas como el día de la semana, el mes, etc., y la etiqueta es el número de
alquileres de bicicletas.
Para entrenar el modelo, comenzamos con una muestra de datos que contiene las
características, así como los valores conocidos de la etiqueta, por lo que, en este
caso, necesitamos datos históricos que incluyan fechas, condiciones meteorológicas
y el número de alquileres de bicicletas.
56 115
61 126
67 137
72 140
76 152
82 156
54 114
62 129
56 115
61 126
67 137
72 140
76 152
Ahora es necesario ajustar estos valores a una función, permitiendo una cierta
variación aleatoria. Probablemente pueda ver que los puntos trazados forman casi
una línea recta diagonal; es decir, existe una supuesta relación lineal entre x e y, por
lo que tenemos que encontrar una función lineal que se ajuste de la mejor manera a
la muestra de datos. Hay varios algoritmos que se pueden usar para establecer esta
función que, en definitiva, buscará una línea recta con la varianza total mínima de
los puntos trazados, de este modo:
La línea representa una función lineal que se puede usar con cualquier valor de x
para aplicar la pendiente de la línea y su intersección (donde la línea cruza el eje y
cuando x es 0) para calcular y. En este caso, si extendiésemos la línea a la
izquierda, veríamos que cuando x es 0, y es aproximadamente 20, y la pendiente de
la línea es tal que para cada unidad de x que avanza hacia la derecha, y aumenta
aproximadamente 1,7. Por lo tanto, la función f se puede calcular como 20 + 1,7x.
Ahora que hemos definido la función de predicción, podemos usarla para predecir
las etiquetas para los datos de validación que retuvimos y comparar los valores de
predicción (lo que normalmente se indica con el símbolo ŷ, o "y con acento
circunflejo") con los valores de y conocidos reales.
x y ŷ
82 156 159,4
54 114 111,8
62 129 125,4
Hay varias maneras de medir la varianza entre los valores predichos y los reales, y
podemos usar estas métricas para evaluar el grado de predicción del modelo.
Nota
Una de las formas más comunes de medir la pérdida es elevar al cuadrado los
residuales individuales, sumar los cuadrados y calcular la media. Elevar el valor
residual al cuadrado tiene el efecto de basar el cálculo en valores absolutos (sin
hacer caso a si la diferencia es negativa o positiva) y dar mayor ponderación a las
diferencias más grandes. Esta métrica se denomina error cuadrático medio.
Sum ∑ 29,36
Media x̄ 9,79
Por lo tanto, la pérdida del modelo basada en la métrica del ECM es de 9,79.
¿Es bueno eso? Es difícil de saber porque el valor del ECM no se expresa en una
unidad de medida significativa. Sabemos que cuanto menor sea el valor, menos
pérdida tendrá el modelo; y, por tanto, mejor será la predicción. Esto lo convierte en
una métrica útil para comparar dos modelos y encontrar el que tenga mejor
rendimiento.
A veces, resulta más útil expresar la pérdida en la misma unidad de medida que el
propio valor de etiqueta predicho, en este caso, el número de alquileres. Es posible
hacer esto si se calcula la raíz cuadrada del ECM, lo que genera una métrica
conocida, evidentemente, como raíz del error cuadrático medio (RECM).
√9,79 = 3,13
Por lo tanto, la RECM del modelo indica que la pérdida está apenas por encima de
3, lo que se puede interpretar de forma flexible como que, en promedio, las
predicciones incorrectas se equivocan en unos 3 alquileres.
Hay muchas otras métricas que se pueden usar para medir la pérdida en una
regresión. Por ejemplo, R2 (R al cuadrado) (a veces conocido como coeficiente de
determinación) es la correlación entre x e y al cuadrado. Esto genera un valor entre
0 y 1 que mide la cantidad de varianza que se puede explicar por el modelo. En
general, cuanto más se acerque a 1 este valor, mejor será la predicción del modelo.
Siguiente unidad: Ejercicio: Entrenamiento y
evaluación de un modelo de regresión
Regression
Supervised machine learning techniques involve training a model to operate on a set
of features and predict a label using a dataset that includes some already-known
label values. The training process fits the features to the known labels to define a
general function that can be applied to new features for which the labels are
unknown, and predict them. You can think of this function like this, in which y
represents the label we want to predict and x represents the features the model uses
to predict it.
The goal of training the model is to find a function that performs some kind of
calculation to the x values that produces the result y. We do this by applying a
machine learning algorithm that tries to fit the x values to a calculation that produces
y reasonably accurately for all of the cases in the training dataset.
There are lots of machine learning algorithms for supervised learning, and they can
be broadly divided into two types:
In this notebook, we'll focus on regression, using an example based on a real study in
which data for a bicycle sharing scheme was collected and used to predict the
number of rentals based on seasonality and weather conditions. We'll use a
simplified version of the dataset from that study.
Citation: The data used in this exercise is derived from Capital Bikeshare and is used
in accordance with the published license agreement.
Let's start by loading the bicycle sharing data as a Pandas DataFrame and viewing
the first few rows.
import pandas as pd
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/daily-bike-share.csv
bike_data = pd.read_csv('daily-bike-share.csv')
bike_data.head()
The data consists of the following columns:
In this dataset, rentals represents the label (the y value) our model must be trained to
predict. The other columns are potential features (x values).
We might get a clearer idea of the distribution of rentals values by visualizing the
data. Common plot types for visualizing numeric data distributions are histograms
and box plots, so let's use Python's matplotlib library to create one of each of these
for the rentals column.
import pandas as pd
import matplotlib.pyplot as plt
# This ensures plots are displayed inline in the Jupyter notebook
%matplotlib inline
# Get the label column
label = bike_data['rentals']
# Create a figure for 2 subplots (2 rows, 1 column)
fig, ax = plt.subplots(2, 1, figsize = (9,12))
# Plot the histogram
ax[0].hist(label, bins=100)
ax[0].set_ylabel('Frequency')
# Add lines for the mean, median, and mode
ax[0].axvline(label.mean(), color='magenta', linestyle='dashed',
linewidth=2)
ax[0].axvline(label.median(), color='cyan', linestyle='dashed',
linewidth=2)
# Plot the boxplot
ax[1].boxplot(label, vert=False)
ax[1].set_xlabel('Rentals')
# Add a title to the Figure
fig.suptitle('Rental Distribution')
# Show the figure
fig.show()
Resultado
The plots show that the number of daily rentals ranges from 0 to just over 3,400.
However, the mean (and median) number of daily rentals is closer to the low end of
that range, with most of the data between 0 and around 2,200 rentals. The few
values above this are shown in the box plot as small circles, indicating that they are
outliers - in other words, unusually high or low values beyond the typical range of
most of the data.
We can do the same kind of visual exploration of the numeric features. Let's create a
histogram for each of these.
# Plot a histogram for each numeric feature
for col in numeric_features:
fig = plt.figure(figsize=(9, 6))
ax = fig.gca()
feature = bike_data[col]
feature.hist(bins=100, ax = ax)
ax.axvline(feature.mean(), color='magenta', linestyle='dashed',
linewidth=2)
ax.axvline(feature.median(), color='cyan', linestyle='dashed',
linewidth=2)
ax.set_title(col)
plt.show()
Resultado:
The numeric features seem to be more normally distributed, with the mean and
median nearer the middle of the range of values, coinciding with where the most
commonly occurring values are.
Note: The distributions are not truly normal in the statistical sense, which would
result in a smooth, symmetric "bell-curve" histogram with the mean and mode (the
most common value) in the center; but they do generally indicate that most of the
observations have a value somewhere near the middle.
We've explored the distribution of the numeric values in the dataset, but what about
the categorical features? These aren't continuous numbers on a scale, so we can't
use histograms; but we can plot a bar chart showing the count of each discrete value
for each category.
import numpy as np
# plot a bar plot for each categorical feature count
categorical_features =
['season','mnth','holiday','weekday','workingday','weathersit', 'day']
for col in categorical_features:
counts = bike_data[col].value_counts().sort_index()
fig = plt.figure(figsize=(9, 6))
ax = fig.gca()
counts.plot.bar(ax = ax, color='steelblue')
ax.set_title(col + ' counts')
ax.set_xlabel(col)
ax.set_ylabel("Frequency")
plt.show()
Resultado
Many of the categorical features show a more or less uniform distribution (meaning
there's roughly the same number of rows for each category). Exceptions to this
include:
● holiday: There are many fewer days that are holidays than days that aren't.
● workingday: There are more working days than non-working days.
● weathersit: Most days are category 1 (clear), with category 2 (mist and cloud)
the next most common. There are comparatively few category 3 (light rain or
snow) days, and no category 4 (heavy rain, hail, or fog) days at all.
Now that we know something about the distribution of the data in our columns, we
can start to look for relationships between the features and the rentals label we want
to be able to predict.
For the numeric features, we can create scatter plots that show the intersection of
feature and label values. We can also calculate the correlation statistic to quantify
the apparent relationship..
for col in numeric_features:
fig = plt.figure(figsize=(9, 6))
ax = fig.gca()
feature = bike_data[col]
label = bike_data['rentals']
correlation = feature.corr(label)
plt.scatter(x=feature, y=label)
plt.xlabel(col)
plt.ylabel('Bike Rentals')
ax.set_title('rentals vs ' + col + '- correlation: ' +
str(correlation))
plt.show()
Resultado:
The results aren't conclusive, but if you look closely at the scatter plots for temp and
atemp, you can see a vague diagonal trend showing that higher rental counts tend to
coincide with higher temperatures; and a correlation value of just over 0.5 for both of
these features supports this observation. Conversely, the plots for hum and
windspeed show a slightly negative correlation, indicating that there are fewer
rentals on days with high humidity or windspeed.
Now let's compare the categorical features to the label. We'll do this by creating box
plots that show the distribution of rental counts for each category.
# plot a boxplot for the label by each categorical feature
for col in categorical_features:
fig = plt.figure(figsize=(9, 6))
ax = fig.gca()
bike_data.boxplot(column = 'rentals', by = col, ax = ax)
ax.set_title('Label by ' + col)
ax.set_ylabel("Bike Rentals")
plt.show()
Resultado:
The plots show some variance in the relationship between some category values and
rentals. For example, there's a clear difference in the distribution of rentals on
weekends (weekday 0 or 6) and those during the working week (weekday 1 to 5).
Similarly, there are notable differences for holiday and workingday categories.
There's a noticeable trend that shows different rental distributions in spring and
summer months compared to winter and fall months. The weathersit category also
seems to make a difference in rental distribution. The day feature we created for the
day of the month shows little variation, indicating that it's probably not predictive of
the number of rentals.
We could train a model using all of the data; but it's common practice in supervised
learning to split the data into two subsets; a (typically larger) set with which to train
the model, and a smaller "hold-back" set with which to validate the trained model.
This enables us to evaluate how well the model performs when used with the
validation dataset by comparing the predicted labels to the known labels. It's
important to split the data randomly (rather than say, taking the first 70% of the data
for training and keeping the rest for validation). This helps ensure that the two
subsets of data are statistically comparable (so we validate the model with data that
has a similar statistical distribution to the data on which it was trained).
To randomly split the data, we'll use the train_test_split function in the scikit-learn
library. This library is one of the most widely used machine learning packages for
Python.
from sklearn.model_selection import train_test_split
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.30, random_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0],
X_test.shape[0]))
Now we have the following four datasets:
Now we're ready to train a model by fitting a suitable regression algorithm to the
training data. We'll use a linear regression algorithm, a common starting point for
regression that works by trying to find a linear relationship between the X values and
the y label. The resulting model is a function that conceptually defines a line where
every possible X and y value combination intersect.
You can quantify the residuals by calculating a number of commonly used evaluation
metrics. We'll focus on the following three:
● Mean Square Error (MSE): The mean of the squared differences between
predicted and actual values. This yields a relative metric in which the smaller
the value, the better the fit of the model
● Root Mean Square Error (RMSE): The square root of the MSE. This yields an
absolute metric in the same unit as the label (in this case, numbers of
rentals). The smaller the value, the better the model (in a simplistic sense, it
represents the average number of rentals by which the predictions are wrong!)
● Coefficient of Determination (usually known as R-squared or R2): A relative
metric in which the higher the value, the better the fit of the model. In essence,
this metric represents how much of the variance between predicted and
actual label values the model is able to explain.
Note: You can find out more about these and other metrics for evaluating regression
models in the Scikit-Learn documentation
Let's use Scikit-Learn to calculate these metrics for our model, based on the
predictions it generated for the validation data.
from sklearn.metrics import mean_squared_error, r2_score
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
So now we've quantified the ability of our model to predict the number of rentals. It
definitely has some predictive power, but we can probably do better!
Summary
Here we've explored our data and fit a basic regression model. In the next notebook,
we will try a number of other regression algorithms to improve performance
Descubrimiento de nuevos modelos de
regresión
Completado
100 XP
5 minutos
En la unidad 2, hemos visto cómo ajustar una línea recta a los puntos de datos. Sin
embargo, la regresión puede ajustarse a muchos tipos de relaciones, incluidas
aquellas con varios factores y aquellas en las que la importancia de un factor
depende de otro.
Los árboles de decisión adoptan un enfoque paso a paso para predecir una variable.
Si pensamos en el ejemplo de las bicicletas, el árbol de decisión puede dividir
primero los ejemplos entre los que son durante primavera y verano y otoño e
invierno, para hacer una predicción basada en el día de la semana. El lunes de
primavera y verano puede tener una tasa de alquiler de bicicletas de 100 al día,
mientras que el lunes de otoño e invierno puede tener una tasa de alquiler de 20 al
día.
Let's start by loading the bicycle sharing data as a Pandas DataFrame and viewing
the first few rows. We'll also split our data into training and test datasets.
# Import modules we'll need for this notebook
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/daily-bike-share.csv
bike_data = pd.read_csv('daily-bike-share.csv')
bike_data['day'] = pd.DatetimeIndex(bike_data['dteday']).day
numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
categorical_features =
['season','mnth','holiday','weekday','workingday','weathersit', 'day']
bike_data[numeric_features + ['rentals']].describe()
print(bike_data.head())
# Separate features and labels
# After separating the dataset, we now have numpy arrays named **X**
containing the features, and **y** containing the labels.
X, y = bike_data[['season','mnth',
'holiday','weekday','workingday','weathersit','temp', 'atemp', 'hum',
'windspeed']].values, bike_data['rentals'].values
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.30, random_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0],
X_test.shape[0]))
Resultado:
Now we're ready to train a model by fitting a suitable regression algorithm to the
training data.
● Linear algorithms: Not just the Linear Regression algorithm we used above
(which is technically an Ordinary Least Squares algorithm), but other variants
such as Lasso and Ridge.
● Tree-based algorithms: Algorithms that build a decision tree to reach a
prediction.
● Ensemble algorithms: Algorithms that combine the outputs of multiple base
algorithms to improve generalizability.
Note: For a full list of Scikit-Learn estimators that encapsulate algorithms for
supervised machine learning, see the Scikit-Learn documentation. There are many
algorithms to choose from, but for most real-world scenarios, the Scikit-Learn
estimator cheat sheet can help you find a suitable starting point.
Try Another Linear Algorithm
Let's try training our regression model by using a Lasso algorithm. We can do this by
just changing the estimator in the training code.
from sklearn.linear_model import Lasso
# Fit a lasso model on the training set
model = Lasso().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
# overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
Try a Decision Tree Algorithm
As an alternative to a linear model, there's a category of algorithms for machine
learning that uses a tree-based approach in which the features in the dataset are
examined in a series of evaluations, each of which results in a branch in a decision
tree based on the feature value. At the end of each series of branches are leaf-nodes
with the predicted label value based on the feature values.
It's easiest to see how this works with an example. Let's train a Decision Tree
regression model using the bike rental data. After training the model, the code below
will print the model definition and a text representation of the tree it uses to predict
label values.
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree import export_text
# Train the model
model = DecisionTreeRegressor().fit(X_train, y_train)
print (model, "\n")
# Visualize the model tree
tree = export_text(model)
print(tree)
Resultado
So now we have a tree-based model; but is it any good? Let's evaluate it with the test
data.
# Evaluate the model using the test data
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
# overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
The tree-based model doesn't seem to have improved over the linear model, so what
else could we try?
Resultado:
For good measure, let's also try a boosting ensemble algorithm. We'll use a Gradient
Boosting estimator, which like a Random Forest algorithm builds multiple trees, but
instead of building them all independently and taking the average result, each tree is
built on the outputs of the previous one in an attempt to incrementally reduce the
loss (error) in the model.
# Train the model
from sklearn.ensemble import GradientBoostingRegressor
# Fit a lasso model on the training set
model = GradientBoostingRegressor().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
# overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
Summary
Here we've tried a number of new regression algorithms to improve performance. In
our notebook we'll look at 'tuning' these algorithms to improve performance.
Mejora de los modelos con
hiperparámetros
Completado
100 XP
5 minutos
A menudo, los modelos simples con conjuntos de datos pequeños se pueden ajustar
en un solo paso, mientras que los conjuntos de datos más grandes y los modelos
más complejos deben ajustarse mediante el uso repetido del modelo con datos de
entrenamiento y la comparación de la salida con la etiqueta esperada. Si la
predicción es lo suficientemente precisa, consideramos que el modelo está
entrenado. Si no es así, se ajusta ligeramente el modelo y se vuelve a repetir.
Los hiperparámetros son valores que cambian la forma en que el modelo se ajusta
durante estos bucles. La velocidad de aprendizaje, por ejemplo, es un
hiperparámetro que establece cuánto se ajusta un modelo durante cada ciclo de
entrenamiento. Una alta velocidad de aprendizaje significa que un modelo se puede
entrenar más rápido, pero si es demasiado alta, los ajustes pueden ser tan grandes
que el modelo nunca termine de ajustarse y no sea óptimo.
Preprocesamiento de datos
El preprocesamiento hace referencia a los cambios realizados en los datos antes de
pasarse al modelo. Ya hemos leído que el preprocesamiento puede implicar la
limpieza del conjunto de datos. Aunque esto es importante, el preprocesamiento
también puede incluir el cambio del formato de los datos para que el modelo los
pueda usar más fácilmente. Por ejemplo, los datos descritos como "rojo", "naranja",
"amarillo", "lima" y "verde", pueden funcionar mejor si se convierten en un formato
más nativo para los equipos, como números que indican la cantidad de rojo y la
cantidad de verde.
Características de escalado
Let's start by loading the bicycle sharing data as a Pandas DataFrame and viewing
the first few rows. As usual, we'll also split our data into training and test datasets.
# Import modules we'll need for this notebook
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/daily-bike-share.csv
bike_data = pd.read_csv('daily-bike-share.csv')
bike_data['day'] = pd.DatetimeIndex(bike_data['dteday']).day
numeric_features = ['temp', 'atemp', 'hum', 'windspeed']
categorical_features =
['season','mnth','holiday','weekday','workingday','weathersit', 'day']
bike_data[numeric_features + ['rentals']].describe()
print(bike_data.head())
# Separate features and labels
# After separating the dataset, we now have numpy arrays named **X**
containing the features, and **y** containing the labels.
X, y = bike_data[['season','mnth',
'holiday','weekday','workingday','weathersit','temp', 'atemp', 'hum',
'windspeed']].values, bike_data['rentals'].values
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.30, random_state=0)
print ('Training Set: %d rows\nTest Set: %d rows' % (X_train.shape[0],
X_test.shape[0]))
Resultado:
Now we're ready to train a model by fitting a boosting ensemble algorithm, as in our
last notebook. Recall that a Gradient Boosting estimator, is like a Random Forest
algorithm, but instead of building them all trees independently and taking the
average result, each tree is built on the outputs of the previous one in an attempt to
incrementally reduce the loss (error) in the model.
# Train the model
from sklearn.ensemble import GradientBoostingRegressor,
RandomForestRegressor
# Fit a lasso model on the training set
model = GradientBoostingRegressor().fit(X_train, y_train)
print (model, "\n")
# Evaluate the model using the test data
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
# overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
Optimize Hyperparameters
Take a look at the GradientBoostingRegressor estimator definition in the output
above, and note that it, like the other estimators we tried previously, includes a large
number of parameters that control the way the model is trained. In machine learning,
the term parameters refers to values that can be determined from data; values that
you specify to affect the behavior of a training algorithm are more correctly referred
to as hyperparameters.
The specific hyperparameters for an estimator vary based on the algorithm that the
estimator encapsulates. In the case of the GradientBoostingRegressor estimator, the
algorithm is an ensemble that combines multiple decision trees to create an overall
predictive model. You can learn about the hyperparameters for this estimator in the
Scikit-Learn documentation.
We won't go into the details of each hyperparameter here, but they work together to
affect the way the algorithm trains a model. In many cases, the default values
provided by Scikit-Learn will work well; but there may be some advantage in
modifying hyperparameters to get better predictive performance or reduce training
time.
So how do you know what hyperparameter values you should use? Well, in the
absence of a deep understanding of how the underlying algorithm works, you'll need
to experiment. Fortunately, SciKit-Learn provides a way to tune hyperparameters by
trying multiple combinations and finding the best result for a given performance
metric.
Let's try using a grid search approach to try combinations from a grid of possible
values for the learning_rate and n_estimators hyperparameters of the
GradientBoostingRegressor estimator.
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer, r2_score
# Use a Gradient Boosting algorithm
alg = GradientBoostingRegressor()
# Try these hyperparameter values
params = {
'learning_rate': [0.1, 0.5, 1.0],
'n_estimators' : [50, 100, 150]
}
# Find the best hyperparameter combination to optimize the R2 metric
score = make_scorer(r2_score)
gridsearch = GridSearchCV(alg, params, scoring=score, cv=3,
return_train_score=True)
gridsearch.fit(X_train, y_train)
print("Best parameter combination:", gridsearch.best_params_, "\n")
# Get the best model
model=gridsearch.best_estimator_
print(model, "\n")
# Evaluate the model using the test data
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
# overlay the regression line
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
Note: The use of random values in the Gradient Boosting algorithm results in slightly
different metrics each time. In this case, the best model produced by hyperparameter
tuning is unlikely to be significantly better than one trained with the default
hyperparameter values; but it's still useful to know about the hyperparameter tuning
technique!
In practice, it's common to perform some preprocessing of the data to make it easier
for the algorithm to fit a model to it. There's a huge range of preprocessing
transformations you can perform to get your data ready for modeling, but we'll limit
ourselves to a few common techniques:
Scaling numeric features
Normalizing numeric features so they're on the same scale prevents features with
large values from producing coefficients that disproportionately affect the
predictions. For example, suppose your data includes the following numeric features:
A B C
3 480 65
Normalizing these features to the same scale may result in the following values
(assuming A contains values from 0 to 10, B contains values from 0 to 1000, and C
contains values from 0 to 100):
A B C
0. 0.4 0.6
3 8 5
There are multiple ways you can scale numeric data, such as calculating the
minimum and maximum values for each column and assigning a proportional value
between 0 and 1, or by using the mean and standard deviation of a normally
distributed variable to maintain the same spread of values on a different scale.
Size
L
You can apply ordinal encoding to substitute a unique integer value for each
category, like this:
Size
Another common technique is to use one hot encoding to create individual binary (0
or 1) features for each possible category value. For example, you could use one-hot
encoding to translate the possible categories into binary columns like this:
1 0 0
0 1 0
0 0 1
To apply these preprocessing transformations to the bike rental, we'll make use of a
Scikit-Learn feature named pipelines. These enable us to define a set of
preprocessing steps that end with an algorithm. You can then fit the entire pipeline to
the data, so that the model encapsulates all of the preprocessing steps as well as
the regression algorithm. This is useful, because when we want to use the model to
predict values from new data, we need to apply the same transformations (based on
the same statistical distributions and category encodings used with the training
data).
Note: The term pipeline is used extensively in machine learning, often to mean very
different things! In this context, we're using it to refer to pipeline objects in
Scikit-Learn, but you may see it used elsewhere to mean something else.
# Train the model
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LinearRegression
import numpy as np
# Define preprocessing for numeric columns (scale them)
numeric_features = [6,7,8,9]
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())])
# Define preprocessing for categorical features (encode them)
categorical_features = [0,1,2,3,4,5]
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# Combine preprocessing steps
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# Create preprocessing and training pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('regressor', GradientBoostingRegressor())])
# fit the pipeline to train a linear regression model on the training
set
model = pipeline.fit(X_train, (y_train))
print (model)
Resultado:
OK, the model is trained, including the preprocessing steps. Let's see how it performs
with the validation data.
# Get predictions
predictions = model.predict(X_test)
# Display metrics
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions')
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
The pipeline is composed of the transformations and the algorithm used to train the
model. To try an alternative algorithm you can just change that step to a different
kind of estimator.
# Use a different estimator in the pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('regressor', RandomForestRegressor())])
# fit the pipeline to train a linear regression model on the training
set
model = pipeline.fit(X_train, (y_train))
print (model, "\n")
# Get predictions
predictions = model.predict(X_test)
# Display metrics
mse = mean_squared_error(y_test, predictions)
print("MSE:", mse)
rmse = np.sqrt(mse)
print("RMSE:", rmse)
r2 = r2_score(y_test, predictions)
print("R2:", r2)
# Plot predicted vs actual
plt.scatter(y_test, predictions)
plt.xlabel('Actual Labels')
plt.ylabel('Predicted Labels')
plt.title('Daily Bike Share Predictions - Preprocessed')
z = np.polyfit(y_test, predictions, 1)
p = np.poly1d(z)
plt.plot(y_test,p(y_test), color='magenta')
plt.show()
Resultado:
We've now seen a number of common techniques used to train predictive models for
regression. In a real project, you'd likely try a few more algorithms, hyperparameters,
and preprocessing transformations; but by now you should have got the general
idea. Let's explore how you can use the trained model with new data.
Summary
That concludes the notebooks for this module on regression. In this notebook we ran
a complex regression, tuned it, saved the model, and used it to predict outcomes for
the future.
Identificación de escenarios de
aprendizaje automático de regresión
Completado
100 XP
3 minutos
100 XP
5 minutos
Lo más importante es que Azure Machine Learning ayuda a los científicos de datos
a aumentar su eficiencia mediante la automatización de muchas de las tareas que
consumen mucho tiempo asociadas a los modelos de entrenamiento. Les permite
usar recursos de proceso basados en la nube que se escalan de manera eficaz para
manejar grandes volúmenes de datos, incurriendo en costes solo cuando realmente
se usan.
100 XP
4 minutos
Pipelines
Las canalizaciones permiten organizar, administrar y reutilizar flujos de trabajo de
aprendizaje automático complejos entre proyectos y usuarios. Una canalización se
inicia con el conjunto de datos desde el que quiere entrenar el modelo. Cada vez
que se ejecuta una canalización, la configuración de esta y sus resultados se
almacenan en el área de trabajo como un trabajo de canalización.
Componentes
Un componente de Azure Machine Learning encapsula un paso en una canalización
de aprendizaje automático. Puede considerar un componente como una función de
programación y como un bloque de creación para las canalizaciones de Azure
Machine Learning. En un proyecto de canalización, puede acceder a los
componentes y recursos de datos desde la pestaña Biblioteca de recursos del panel
izquierdo.
Conjuntos de datos
Puede crear recursos de datos en la página Datos a partir de archivos locales, un
almacén de datos, archivos web y Open Datasets. Estos recursos de datos
aparecerán junto con los conjuntos de datos de ejemplo estándar en la biblioteca de
recursos del diseñador.
100 XP
6 minutos
Entrenamiento de un modelo
Para entrenar un modelo de regresión, necesita un conjunto de datos que incluya
características históricas, características de la entidad para la que quiere realizar
una predicción y valores de etiqueta conocidos. La etiqueta es la cantidad que
quiere para entrenar un modelo que va a predecir.
Canalización de inferencia
Implementación
100 XP
55 minutos
https://microsoftlearning.github.io/AI-900-AIFundamentals/instructions/02a-create-regression
-model.html
Entrenamiento y evaluación de
modelos de clasificación
47 min.
Módulo
9 Unidades
4.8 (1870)
Califíquelo
IntermedioCientífico de datosAzure
InicioSumar
Requisitos previos
● Conceptos matemáticos básicos
● Programación con Python
Introducción
Completado
100 XP
2 minutos
Requisitos previos
● Conocimientos de matemáticas básicas
● Experiencia previa con la programación en Python
Objetivos de aprendizaje
En este módulo, aprenderá a:
¿Qué es la clasificación?
Completado
100 XP
5 minutos
Se usa un valor de umbral, normalmente 0,5, para determinar la clase predicha, por
lo que si la clase positiva (en este caso, diabético) tiene una probabilidad predicha
mayor que el umbral, se predice una clasificación de diabético.
Un ejemplo sencillo
Vamos a explorar un ejemplo sencillo para ayudar a explicar los principios clave.
Supongamos que tenemos los siguientes datos sobre los pacientes, que constan de
una característica única (nivel de glucosa en sangre) y una etiqueta de clase (0 para
no diabético, 1 para diabético).
Glucosa en sangre Diabético
82 0
92 0
112 1
102 0
115 1
107 1
87 0
120 1
83 0
119 1
104 1
105 0
86 0
109 1
Una de ellas es una función logística, que forma una curva sigmoidea (con forma de
S), similar a la siguiente:
Ahora podemos usar la función para calcular un valor de probabilidad donde y sea
positivo (es decir, el paciente es diabético) a partir de cualquier valor de x buscando
el punto en la línea de función para x. Podemos establecer un valor de umbral de
0,5 como punto de corte para la predicción de la etiqueta de clase.
Los puntos trazados debajo de la línea de umbral producirán una clase predicha de
0 (no diabéticos), y los puntos por encima de la línea se predecirán como 1
(diabético).
83 0 0
119 1 1
104 1 0
105 0 1
86 0 0
109 1 1
Binary Classification
In this notebook, we will focus on an example of binary classification, where the
model must predict a label that belongs to one of two classes. In this exercise, we'll
train a binary classifier to predict whether or not a patient should be tested for
diabetes based on some medical data.
Citation: The diabetes dataset used in this exercise is based on data originally
collected by the National Institute of Diabetes and Digestive and Kidney Diseases.
Celda Markdown vacía. Haga doble clic o presione Entrar para agregar contenido.
import pandas as pd
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/diabetes.csv
diabetes = pd.read_csv('diabetes.csv')
diabetes.head()
This data consists of diagnostic information about some patients who have been
tested for diabetes. Scroll to the right if necessary, and note that the final column in
the dataset (Diabetic) contains the value 0 for patients who tested negative for
diabetes, and 1 for patients who tested positive. This is the label that we will train our
model to predict; most of the other columns
(Pregnancies,PlasmaGlucose,DiastolicBloodPressure, and so on) are the features we
will use to predict the Diabetic label.
Let's separate the features from the labels - we'll call the features X and the label y:
# Separate features and labels
features =
['Pregnancies','PlasmaGlucose','DiastolicBloodPressure','TricepsThickne
ss','SerumInsulin','BMI','DiabetesPedigree','Age']
label = 'Diabetic'
X, y = diabetes[features].values, diabetes[label].values
for n in range(0,4):
print("Patient", str(n+1), "\n Features:",list(X[n]), "\n
Label:", y[n])
Resultado:
Now let's compare the feature distributions for each label value.
from matplotlib import pyplot as plt
%matplotlib inline
features =
['Pregnancies','PlasmaGlucose','DiastolicBloodPressure','TricepsThickne
ss','SerumInsulin','BMI','DiabetesPedigree','Age']
for col in features:
diabetes.boxplot(column=col, by='Diabetic', figsize=(6,6))
plt.title(col)
plt.show()
For some of the features, there's a noticeable difference in the distribution for each
label value. In particular, Pregnancies and Age show markedly different distributions
for diabetic patients than for non-diabetic patients. These features may help predict
whether or not a patient is diabetic.
Split the data
Our dataset includes known values for the label, so we can use this to train a
classifier so that it finds a statistical relationship between the features and the label
value; but how will we know if our model is any good? How do we know it will predict
correctly when we use it with new data that it wasn't trained with? Well, we can take
advantage of the fact we have a large dataset with known label values, use only
some of it to train the model, and hold back some to test the trained model - enabling
us to compare the predicted labels with the already known labels in the test set.
In Python, the scikit-learn package contains a large number of functions we can use
to build a machine learning model - including a train_test_split function that ensures
we get a statistically random split of training and test data. We'll use that to split the
data into 70% for training and hold back 30% for testing.
from sklearn.model_selection import train_test_split
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.30, random_state=0)
print ('Training cases: %d\nTest cases: %d' % (X_train.shape[0],
X_test.shape[0]))
Resultado:
Resultado:
# Train the model
from sklearn.linear_model import LogisticRegression
Now we've trained the model using the training data, we can use the test data we
held back to evaluate how well it predicts. Again, scikit-learn can help us do this.
Let's start by using the model to predict labels for our test set, and compare the
predicted labels to the known labels:
predictions = model.predict(X_test)
print('Predicted labels: ', predictions)
print('Actual labels: ' ,y_test)
Resultado:
The arrays of labels are too long to be displayed in the notebook output, so we can
only compare a few values. Even if we printed out all of the predicted and actual
labels, there are too many of them to make this a sensible way to evaluate the
model. Fortunately, scikit-learn has a few more tricks up its sleeve, and it provides
some metrics that we can use to evaluate the model.
The most obvious thing you might want to do is to check the accuracy of the
predictions - in simple terms, what proportion of the labels did the model predict
correctly?
from sklearn.metrics import accuracy_score
print('Accuracy: ', accuracy_score(y_test, predictions))
Resultado:
The accuracy is returned as a decimal value - a value of 1.0 would mean that the
model got 100% of the predictions right; while an accuracy of 0.0 is, well, pretty
useless!
Summary
Here we prepared our data by splitting it into test and train datasets, and applied
logistic regression - a way of applying binary labels to our data. Our model was able
to predict whether patients had diabetes with what appears like reasonable
accuracy. But is this good enough? In the next notebook we will look at alternatives
to accuracy that can be much more useful in machine learning.
100 XP
4 minutos
83 0 0
119 1 1
104 1 0
105 0 1
86 0 0
109 1 1
Las celdas de la matriz de confusión se suelen sombrear para que los valores más
altos tengan un sombreado más profundo. De este modo, resulta más fácil ver una
tendencia diagonal fuerte de la parte superior izquierda a la inferior derecha,
resaltando las celdas en las que el valor predicho y el valor real son los mismos.
A partir de estos valores principales, puede calcular un rango de otras métricas que
pueden ayudarle a evaluar el rendimiento del modelo. Por ejemplo:
Classification Metrics
In the last notebook we fit binary classifier to predict whether patients were diabetic or not.
We used accuracy as a measure of how well the model performed, but accuracy isn't
everything. In this notebook, we will look at alternatives to accuracy that can be much more
useful in machine learning.
Fortunately, there are some other metrics that reveal a little more about how our model is
performing. Scikit-Learn includes the ability to create a classification report that provides
more insight than raw accuracy alone.
To get started, run the next cell to load our data and train our model like last time.
Celda Markdown vacía. Haga doble clic o presione Entrar para agregar contenido.
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to
-machine-learning/main/Data/ml-basics/diabetes.csv
diabetes = pd.read_csv('diabetes.csv')
# Separate features and labels
features =
['Pregnancies','PlasmaGlucose','DiastolicBloodPressure','TricepsThickne
ss','SerumInsulin','BMI','DiabetesPedigree','Age']
label = 'Diabetic'
X, y = diabetes[features].values, diabetes[label].values
# Split data 70%-30% into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.30, random_state=0)
print ('Training cases: %d\nTest cases: %d' % (X_train.shape[0],
X_test.shape[0]))
# Train the model
from sklearn.linear_model import LogisticRegression
# Set regularization rate
reg = 0.01
# train a logistic regression model on the training set
model = LogisticRegression(C=1/reg, solver="liblinear").fit(X_train,
y_train)
predictions = model.predict(X_test)
print('Predicted labels: ', predictions)
print('Actual labels: ' ,y_test)
print('Accuracy: ', accuracy_score(y_test, predictions))
Reslutado:
One of the simplest places to start is a classification report. Run the next cell to see a range
of alternatives ways to assess our model
from sklearn. metrics import classification_report
print(classification_report(y_test, predictions))
Resultado:
The classification report includes the following metrics for each class (0 and 1)
note that the header row may not line up with the values!
● Precision: Of the predictions the model made for this class, what proportion were
correct?
● Recall: Out of all of the instances of this class in the test dataset, how many did the
model identify?
● F1-Score: An average metric that takes both precision and recall into account.
● Support: How many instances of this class are there in the test dataset?
The classification report also includes averages for these metrics, including a weighted
average that allows for the imbalance in the number of cases of each class.
Because this is a binary classification problem, the 1 class is considered positive and its
precision and recall are particularly interesting - these in effect answer the questions:
● Of all the patients the model predicted are diabetic, how many are actually diabetic?
● Of all the patients that are actually diabetic, how many did the model identify?
You can retrieve these values on their own by using the precision_score and recall_score
metrics in scikit-learn (which by default assume a binary classification model).
from sklearn.metrics import precision_score, recall_score
print("Overall Precision:",precision_score(y_test, predictions))
print("Overall Recall:",recall_score(y_test, predictions))
Resultado:
The precision and recall metrics are derived from four possible prediction outcomes:
● True Positives: The predicted label and the actual label are both 1.
● False Positives: The predicted label is 1, but the actual label is 0.
● False Negatives: The predicted label is 0, but the actual label is 1.
● True Negatives: The predicted label and the actual label are both 0.
These metrics are generally tabulated for the test set and shown together as a confusion
matrix, which takes the following form:
TN FP
FN TP
Note that the correct (true) predictions form a diagonal line from top left to bottom right -
these figures should be significantly higher than the false predictions if the model is any
good.
In Python, you can use the sklearn.metrics.confusion_matrix function to find these values for
a trained classifier:
from sklearn.metrics import confusion_matrix
# Print the confusion matrix
cm = confusion_matrix(y_test, predictions)
print (cm)
Resultado:
Until now, we've considered the predictions from the model as being either 1 or 0 class
labels. Actually, things are a little more complex than that. Statistical machine learning
algorithms, like logistic regression, are based on probability; so what actually gets predicted
by a binary classifier is the probability that the label is true (P(y)) and the probability that the
label is false (1 - P(y)). A threshold value of 0.5 is used to decide whether the predicted label
is a 1 (P(y) > 0.5) or a 0 (P(y) <= 0.5). You can use the predict_proba method to see the
probability pairs for each case:
y_scores = model.predict_proba(X_test)
print(y_scores)
Resultado:
The decision to score a prediction as a 1 or a 0 depends on the threshold to which the
predicted probabilities are compared. If we were to change the threshold, it would affect the
predictions; and therefore change the metrics in the confusion matrix. A common way to
evaluate a classifier is to examine the true positive rate (which is another name for recall)
and the false positive rate for a range of possible thresholds. These rates are then plotted
against all possible thresholds to form a chart known as a received operator characteristic
(ROC) chart, like this:
from sklearn.metrics import roc_curve
from sklearn.metrics import confusion_matrix
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
# calculate ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
# plot ROC curve
fig = plt.figure(figsize=(6, 6))
# Plot the diagonal 50% line
plt.plot([0, 1], [0, 1], 'k--')
# Plot the FPR and TPR achieved by our model
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
The ROC chart shows the curve of the true and false positive rates for different threshold
values between 0 and 1. A perfect classifier would have a curve that goes straight up the left
side and straight across the top. The diagonal line across the chart represents the probability
of predicting correctly with a 50/50 random prediction; so you obviously want the curve to be
higher than that (or your model is no better than simply guessing!).
The area under the curve (AUC) is a value between 0 and 1 that quantifies the overall
performance of the model. The closer to 1 this value is, the better the model. Once again,
scikit-Learn includes a function to calculate this metric.
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_test,y_scores[:,1])
print('AUC: ' + str(auc))
Resultado:
In practice, it's common to perform some preprocessing of the data to make it easier for the
algorithm to fit a model to it. There's a huge range of preprocessing transformations you can
perform to get your data ready for modeling, but we'll limit ourselves to a few common
techniques:
● Scaling numeric features so they're on the same scale. This prevents features with
large values from producing coefficients that disproportionately affect the predictions.
● Encoding categorical variables. For example, by using a one hot encoding technique
you can create individual binary (true/false) features for each possible category
value.
Note: The term pipeline is used extensively in machine learning, often to mean very different
things! In this context, we're using it to refer to pipeline objects in Scikit-Learn, but you may
see it used elsewhere to mean something else.
# Train the model
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
import numpy as np
# Define preprocessing for numeric columns (normalize them so they're
on the same scale)
numeric_features = [0,1,2,3,4,5,6]
numeric_transformer = Pipeline(steps=[
('scaler', StandardScaler())])
# Define preprocessing for categorical features (encode the Age column)
categorical_features = [7]
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# Combine preprocessing steps
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# Create preprocessing and training pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('logregressor', LogisticRegression(C=1/reg,
solver="liblinear"))])
# fit the pipeline to train a logistic regression model on the training
set
model = pipeline.fit(X_train, (y_train))
print (model)
Resultado:
Let's use the model trained by this pipeline to predict labels for our test set, and compare the
performance metrics with the basic model we created previously.
# Get predictions from test data
predictions = model.predict(X_test)
y_scores = model.predict_proba(X_test)
# Get evaluation metrics
cm = confusion_matrix(y_test, predictions)
print ('Confusion Matrix:\n',cm, '\n')
print('Accuracy:', accuracy_score(y_test, predictions))
print("Overall Precision:",precision_score(y_test, predictions))
print("Overall Recall:",recall_score(y_test, predictions))
auc = roc_auc_score(y_test,y_scores[:,1])
print('AUC: ' + str(auc))
# calculate ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
# plot ROC curve
fig = plt.figure(figsize=(6, 6))
# Plot the diagonal 50% line
plt.plot([0, 1], [0, 1], 'k--')
# Plot the FPR and TPR achieved by our model
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
Resultado:
The results look a little better, so clearly preprocessing the data has made a difference.
This time, We'll use the same preprocessing steps as before, but we'll train the model using
an ensemble algorithm named Random Forest that combines the outputs of multiple random
decision trees (for more details, see the Scikit-Learn documentation).
from sklearn.ensemble import RandomForestClassifier
# Create preprocessing and training pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('logregressor',
RandomForestClassifier(n_estimators=100))])
# fit the pipeline to train a random forest model on the training set
model = pipeline.fit(X_train, (y_train))
print (model)
Let's look at the performance metrics for the new model.
predictions = model.predict(X_test)
y_scores = model.predict_proba(X_test)
cm = confusion_matrix(y_test, predictions)
print ('Confusion Matrix:\n',cm, '\n')
print('Accuracy:', accuracy_score(y_test, predictions))
print("Overall Precision:",precision_score(y_test, predictions))
print("Overall Recall:",recall_score(y_test, predictions))
auc = roc_auc_score(y_test,y_scores[:,1])
print('\nAUC: ' + str(auc))
# calculate ROC curve
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
# plot ROC curve
fig = plt.figure(figsize=(6, 6))
# Plot the diagonal 50% line
plt.plot([0, 1], [0, 1], 'k--')
# Plot the FPR and TPR achieved by our model
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
Resultado:
That looks better!
Summary
In this notebook, we looked at a range of metrics for binary classification and tried a few
algorithms beyond logistic regression. We will move onto more complex classification
problems in the following notebook.
Creación de modelos de clasificación
multiclase
Completado
100 XP
4 minutos
También es posible crear modelos de clasificación multiclase, en los que hay más de
dos clases posibles. Por ejemplo, el consultorio médico podría ampliar el modelo de
diabetes para clasificar a los pacientes como:
● No diabéticos
● Diabéticos de tipo 1
● Diabéticos de tipo 2
Los valores de probabilidad de las clases individuales aún sumarían un total de 1 (el
paciente definitivamente está en una de las tres clases), y el modelo prediría la
clase más probable.
En los dos enfoques, el modelo general debe tener en cuenta todas estas
predicciones para determinar a qué categoría única pertenece el elemento.
● One vs Rest (OVR), in which a classifier is created for each possible class value,
with a positive outcome for cases where the prediction is this class, and negative
predictions for cases where the prediction is any other class. A classification problem
with four possible shape classes (square, circle, triangle, hexagon) would require four
classifiers that predict:
○ square or not
○ circle or not
○ triangle or not
○ hexagon or not
● One vs One (OVO), in which a classifier for each possible pair of classes is created.
The classification problem with four shape classes would require the following binary
classifiers:
○ square or circle
○ square or triangle
○ square or hexagon
○ circle or triangle
○ circle or hexagon
○ triangle or hexagon
In both approaches, the overall model that combines the classifiers generates a vector of
predictions in which the probabilities generated from the individual binary classifiers are used
to determine which class to predict.
Citation: The penguins dataset used in the this exercise is a subset of data collected and
made available by Dr. Kristen Gorman and the Palmer Station, Antarctica LTER, a member
of the Long Term Ecological Research Network.
import pandas as pd
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/
main/Data/ml-basics/penguins.csv
penguins = pd.read_csv('penguins.csv')
# Display a random sample of 10 observations
sample = penguins.sample(10)
sample
The dataset contains the following columns:
The Species column is the label we want to train a model to predict. The dataset includes
three possible species, which are encoded as 0, 1, and 2. The actual species names are
revealed by the code below:
penguin_classes = ['Adelie', 'Gentoo', 'Chinstrap']
print(sample.columns[0:5].values, 'SpeciesName')
for index, row in penguins.sample(10).iterrows():
print('[',row[0], row[1], row[2], row[3], int(row[4]),']',penguin_classes[int(row[4])])
Now that we know what the features and labels in the data represent, let's explore the
dataset. First, let's see if there are any missing (null) values.
# Count the number of null values for each column
penguins.isnull().sum()
It looks like there are some missing feature values, but no missing labels. Let's dig a little
deeper and see the rows that contain nulls.
# Show rows containing nulls
penguins[penguins.isnull().any(axis=1)]
There are two rows that contain no feature values at all (NaN stands for "not a number"), so
these won't be useful in training a model. Let's discard them from the dataset.
# Drop rows containing NaN values
penguins=penguins.dropna()
#Confirm there are now no nulls
penguins.isnull().sum()
Now that we've dealt with the missing values, let's explore how the features relate to the
label by creating some box charts.
from matplotlib import pyplot as plt
%matplotlib inline
penguin_features = ['CulmenLength','CulmenDepth','FlipperLength','BodyMass']
penguin_label = 'Species'
for col in penguin_features:
penguins.boxplot(column=col, by=penguin_label, figsize=(6,6))
plt.title(col)
plt.show()
From the box plots, it looks like species 0 and 2 (Adelie and Chinstrap) have similar data
profiles for culmen depth, flipper length, and body mass, but Chinstraps tend to have longer
culmens. Species 1 (Gentoo) tends to have fairly clearly differentiated features from the
others; which should help us train a good classification model.
You can get the overall metrics separately from the report using the scikit-learn metrics score
classes, but with multiclass results you must specify which average metric you want to use
for precision and recall.
from sklearn.metrics import accuracy_score, precision_score, recall_score
print("Overall Accuracy:",accuracy_score(y_penguin_test, penguin_predictions))
print("Overall Precision:",precision_score(y_penguin_test, penguin_predictions,
average='macro'))
print("Overall Recall:",recall_score(y_penguin_test, penguin_predictions, average='macro'))
Now let's look at the confusion matrix for our model:
from sklearn.metrics import confusion_matrix
# Print the confusion matrix
mcm = confusion_matrix(y_penguin_test, penguin_predictions)
print(mcm)
The confusion matrix shows the intersection of predicted and actual label values for each
class - in simple terms, the diagonal intersections from top-left to bottom-right indicate the
number of correct predictions.
When dealing with multiple classes, it's generally more intuitive to visualize this as a heat
map, like this:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(mcm, interpolation="nearest", cmap=plt.cm.Blues)
plt.colorbar()
tick_marks = np.arange(len(penguin_classes))
plt.xticks(tick_marks, penguin_classes, rotation=45)
plt.yticks(tick_marks, penguin_classes)
plt.xlabel("Predicted Species")
plt.ylabel("Actual Species")
plt.show()
The darker squares in the confusion matrix plot indicate high numbers of cases, and you can
hopefully see a diagonal line of darker squares indicating cases where the predicted and
actual label are the same.
In the case of a multiclass classification model, a single ROC curve showing true positive
rate vs false positive rate is not possible. However, you can use the rates for each class in a
One vs Rest (OVR) comparison to create a ROC chart for each class.
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
# Get class probability scores
penguin_prob = multi_model.predict_proba(x_penguin_test)
# Get ROC metrics for each class
fpr = {}
tpr = {}
thresh ={}
for i in range(len(penguin_classes)):
fpr[i], tpr[i], thresh[i] = roc_curve(y_penguin_test, penguin_prob[:,i], pos_label=i)
Resumen
En este módulo, ha aprendido cómo se puede usar la clasificación para crear un modelo de
aprendizaje automático que predice categorías o clases. Después, ha usado el marco de
Scikit-learn en Python para entrenar y evaluar un modelo de clasificación.
Aunque Scikit-learn es un marco popular para escribir código con el fin de entrenar modelos
de clasificación, también puede crear soluciones de aprendizaje automático para
clasificación con las herramientas gráficas de Microsoft Azure Machine Learning. Para
obtener más información sobre el desarrollo sin código de modelos de clasificación
mediante Azure Machine Learning, consulte el módulo Creación de un modelo de
clasificación con el diseñador de Azure Machine Learning.
Introducción
Completado
100 XP
2 minutos
La agrupación en clústeres es común y útil para explorar nuevos datos en los que
aún no se conocen patrones entre puntos de datos, como categorías de alto nivel.
Se usa en muchos campos que necesitan etiquetar automáticamente datos
complejos, incluido el análisis de redes sociales, la conectividad cerebral o el filtrado
de correo no deseado, entre otros.
100 XP
5 minutos
Por ejemplo, supongamos que un botánico observa una muestra de flores y registra
el número de pétalos y hojas en cada flor.
Puede ser útil agrupar estas flores en clústeres en función de las similitudes entre
sus características.
Hay muchas maneras de hacerlo. Por ejemplo, si la mayoría de las flores tienen el
mismo número de hojas, podrían agruparse en aquellas con muchos o pocos
pétalos. Por otra parte, si el número de pétalos y hojas varía considerablemente,
puede haber un patrón que detectar, como que las que tienen muchas hojas
también tienen muchos pétalos. El objetivo del algoritmo de agrupación en clústeres
es encontrar la manera óptima de dividir el conjunto de datos en grupos. El
significado de "óptima" depende del algoritmo utilizado y del conjunto de datos que
se proporciona.
Aunque este ejemplo de la flor puede ser sencillo para un humano con solo unas
pocas muestras, a medida que el conjunto de datos crece a miles de muestras o a
más de dos características, los algoritmos de agrupación en clústeres se vuelven
muy útiles para diseccionar rápidamente un conjunto de datos en grupos.
For example, let's take a look at a dataset that contains measurements of different species
of wheat seed.
Citation: The seeds dataset used in the this exercise was originally published by the Institute
of Agrophysics of the Polish Academy of Sciences in Lublin, and can be downloaded from
the UCI dataset repository (Dua, D. and Graff, C. (2019). UCI Machine Learning Repository
http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and
Computer Science).
import pandas as pd
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/
main/Data/ml-basics/seeds.csv
data = pd.read_csv('seeds.csv')
# Display a random sample of 10 observations (just the features)
features = data[data.columns[0:6]]
features.sample(10)
As you can see, the dataset contains six data points (or features) for each instance
(observation) of a seed. So you could interpret these as coordinates that describe each
instance's location in six-dimensional space.
One way we can try to find out is to use a data sample to create a series of clustering
models with an incrementing number of clusters, and measure how tightly the data points
are grouped within each cluster. A metric often used to measure this tightness is the within
cluster sum of squares (WCSS), with lower values meaning that the data points are closer.
You can then plot the WCSS for each model.
#importing the libraries
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
%matplotlib inline
# Create 10 models with 1 to 10 clusters
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i)
# Fit the data points
kmeans.fit(features.values)
# Get the WCSS (inertia) value
wcss.append(kmeans.inertia_)
Summary
Here we looked at what clustering means, and how to determine whether clustering might be
appropriate for your data. In the next notebook, we will look at two ways of labelling the data
automatically.
Por ejemplo, si aplicamos la agrupación a los significados de las palabras, podemos obtener
un grupo que contenga adjetivos específicos de las emociones ("enfadado", "feliz", etc.),
que a su vez pertenezca a un grupo que contenga todos los adjetivos relacionados con el
ser humano ("feliz", "guapo", "joven"), y este a su vez pertenezca a un grupo aún mayor que
contenga todos los adjetivos ("feliz", "verde", "guapo", "duro", etc.).
La agrupación en clústeres jerárquicas es útil no solo para dividir los datos en grupos, sino
también para comprender las relaciones entre estos grupos. Una ventaja importante de la
agrupación en clústeres jerárquica es que no requiere que el número de clústeres se defina
de antemano y, a veces, puede proporcionar resultados más interpretables que los
enfoques no jerárquicos. El principal inconveniente es que estos enfoques pueden tardar
mucho más tiempo en calcularse que los enfoques más sencillos y, a veces, no son
adecuados para grandes conjuntos de datos.
Citation: The seeds dataset used in the this exercise was originally published by the Institute
of Agrophysics of the Polish Academy of Sciences in Lublin, and can be downloaded from
the UCI dataset repository (Dua, D. and Graff, C. (2019). UCI Machine Learning Repository
http://archive.ics.uci.edu/ml. Irvine, CA: University of California, School of Information and
Computer Science).
import pandas as pd
# load the training dataset
!wget
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/
main/Data/ml-basics/seeds.csv
data = pd.read_csv('seeds.csv')
# Display a random sample of 10 observations (just the features)
features = data[data.columns[0:6]]
features.sample(10)
from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA
# Normalize the numeric features so they're on the same scale
scaled_features = MinMaxScaler().fit_transform(features[data.columns[0:6]])
# Get two principal components
pca = PCA(n_components=2).fit(scaled_features)
features_2d = pca.transform(scaled_features)
features_2d[0:10]
K-Means Clustering
The algorithm we used to create our test clusters is K-Means. This is a commonly used
clustering algorithm that separates a dataset into K clusters of equal variance. The number
of clusters, K, is user defined. The basic algorithm has the following steps:
Sometimes, clustering is used as an initial step towards creating a classification model. You
start by identifying distinct groups of data points, and then assign class labels to those
clusters. You can then use this labelled data to train a classification model.
In the case of the seeds data, the different species of seed are already known and encoded
as 0 (Kama), 1 (Rosa), or 2 (Canadian), so we can use these identifiers to compare the
species classifications to the clusters identified by our unsupervised algorithm
seed_species = data[data.columns[7]]
plot_clusters(features_2d, seed_species.values)
There may be some differences between the cluster assignments and class labels, but the
K-Means model should have done a reasonable job of clustering the observations so that
seeds of the same species are generally in the same cluster.
Hierarchical Clustering
Hierarchical clustering methods make fewer distributional assumptions when compared to
K-means methods. However, K-means methods are generally more scalable, sometimes
very much so.
● Ward linkage measures the increase in variance for the clusters being linked,
● Average linkage uses the mean pairwise distance between the members of the two
clusters,
● Complete or Maximal linkage uses the maximum distance between the members of
the two clusters.
Agglomerative Clustering
Let's see an example of clustering the seeds data using an agglomerative clustering
algorithm.
from sklearn.cluster import AgglomerativeClustering
agg_model = AgglomerativeClustering(n_clusters=3)
agg_clusters = agg_model.fit_predict(features.values)
agg_clusters
So what do the agglomerative cluster assignments look like?
import matplotlib.pyplot as plt
%matplotlib inline
def plot_clusters(samples, clusters):
col_dic = {0:'blue',1:'green',2:'orange'}
mrk_dic = {0:'*',1:'x',2:'+'}
colors = [col_dic[x] for x in clusters]
markers = [mrk_dic[x] for x in clusters]
for sample in range(len(clusters)):
plt.scatter(samples[sample][0], samples[sample][1], color = colors[sample],
marker=markers[sample], s=100)
plt.xlabel('Dimension 1')
plt.ylabel('Dimension 2')
plt.title('Assignments')
plt.show()
plot_clusters(features_2d, agg_clusters)
Summary
Here we practiced using K-means and heirachial clustering. This unsupervised learning has
the ability to take unlabelled data and identify which of these data are similar to one another.
Resumen
En este módulo, ha aprendido a usar la agrupación en clústeres para crear modelos de
aprendizaje automático no supervisados que agrupan observaciones de datos en clústeres.
Después, ha usado el marco scikit-learn en Python para entrenar un modelo de agrupación
en clústeres.
Aunque scikit-learn es un marco popular para escribir código con el fin de entrenar modelos
de agrupación en clústeres, también puede crear soluciones de aprendizaje automático para
la agrupación en clústeres con las herramientas gráficas de Microsoft Azure Machine
Learning. Para obtener más información sobre el desarrollo sin código de modelos de
agrupación en clústeres mediante Azure Machine Learning, consulte el módulo Creación de
un modelo de agrupación en clústeres con el diseñador de Azure Machine Learning.
Introducción
El aprendizaje profundo es una forma avanzada de aprendizaje automático que
intenta emular el modo en que el cerebro humano aprende.
El cerebro tiene células nerviosas, las neuronas, que están conectadas entre sí por
extensiones nerviosas que transmiten señales electroquímicas a través de la red.
Cuando se estimula la primera neurona de la red, se procesa la señal de entrada y,
si supera un umbral determinado, el neurona se activa y transmite la señal a las
neuronas con las que está conectada. A su vez, estas neuronas se pueden activar y
transmitir la señal a través del resto de la red. Con el tiempo, las conexiones entre
los neuronas se refuerzan por el uso frecuente a medida que aprende a responder
de forma eficaz. Por ejemplo, si alguien le lanza un balón, sus conexiones
neuronales le permiten procesar la información visual y coordinar los movimientos
para atraparlo. Si realiza esta acción varias veces, la red de neuronas que le permite
atrapar un balón será más fuerte y, por lo tanto, mejorará a la hora de atrapar un
balón.
Asociado con cada valor x hay un valor ponderación (w), que se usa para fortalecer
o debilitar el efecto del valor x para simular el aprendizaje. Además, se agrega una
entrada sesgo (b) para permitir el control específico sobre la red. Durante el proceso
de entrenamiento, se ajustarán los valores w y b para optimizar la red de modo que
"aprenda" a generar los resultados correctos.
La neurona misma encapsula una función que calcula una suma ponderada de x, w
y b. A su vez, esta función se encuentra en una función de activación que restringe
el resultado (por lo general, a un valor entre 0 y 1) a fin de determinar si la neurona
transmite o no un resultado a la capa siguiente de neuronas de la red.
En este caso, las características (x) son un vector de cuatro valores, o bien,
matemáticamente expresado, x=[x1,x2,x3,x4].
Imagine que la etiqueta que intenta predecir (y) es la especie del pingüino y que hay
tres posibilidades de especie:
1. Adelia
2. Papúa
3. Barbijo
Puede entrenar el modelo de Machine Learning con las observaciones para las que
ya conoce la etiqueta verdadera. Por ejemplo, puede tener las medidas de
características siguientes para un pingüino de Adelia:
Ya sabe que se trata de un ejemplo de un pingüino de Adelia (clase 0), por lo que
una función de clasificación perfecta debe dar como resultado una etiqueta que
indique una probabilidad del 100 % para la clase 0 y una probabilidad del 0 % para
las clases 1 y 2:
y=[1, 0, 0]
● Una capa de entrada con una neurona para cada valor de entrada
esperado (x).
● Dos capas denominadas ocultas, cada una con cinco neuronas.
● Una capa de salida con tres neuronas, una para cada valor de
probabilidad de clase (y) que el modelo va a predecir.
Al crear un modelo como este, debe definir un capa de entrada que admita la
cantidad de características que va a procesar el modelo y una capa de salida que
refleje la cantidad de salidas que espera que genere. Puede decidir la cantidad de
capas ocultas que quiere incluir y cuántas neuronas en cada una de ellas, pero no
tiene ningún control sobre los valores de entrada y salida de estas capas, ya que se
determinan mediante el proceso de entrenamiento del modelo.
Nota
Optimizadores
Ahora viene la parte inteligente. La pérdida se calcula con una función que opera en
los resultados de la capa final de la red, que también es una función. La capa de red
final funciona en las salidas de las capas anteriores, que también son funciones. Por
tanto, todo el modelo, desde la capa de entrada hasta el cálculo de la pérdida, no es
más que una gran función anidada. Las funciones tienen algunas características
muy útiles, entre las que se incluyen las siguientes:
Usamos un optimizador para aplicar este mismo truco a todas las variables de
ponderación y sesgo del modelo y determinar en qué dirección se deben ajustar
(hacia arriba o hacia abajo) para disminuir la cantidad total de pérdidas en el
modelo. Hay varios algoritmos de optimización de uso común, que incluyen el
descenso por gradiente estocástico (SGD), la tasa de aprendizaje adaptativo
(ADADELTA) y la estimación de impulso adaptativo (Adam), entre otros; todos
diseñados para determinar cómo ajustar las ponderaciones y los sesgos para
reducir las pérdidas.
Velocidad de aprendizaje
Ahora, la siguiente pregunta obvia es: ¿cuánto debería ajustar el optimizador los
valores de ponderaciones y sesgos? Si observa el trazado del valor de ponderación,
puede ver que con un ligero aumento de la ponderación, la línea funcional cae
(disminución de la pérdida). Sin embargo, si el valor aumenta demasiado, la línea de
función comenzará a aumentar nuevamente y la pérdida puede incluso aumentar.
Puede ser que después de la época siguiente resulte necesario disminuir la
ponderación.
Antes de comenzar
Para completar el ejercicio, necesitará lo siguiente:
Nota
Configuración Valor
Detalles del
proyecto
6.
Acepte el resto de los valores predeterminados y seleccione Revisar y
crear.
7. Una vez pasada la validación, seleccione Crear.
Espere a que se cree el recurso de área de trabajo, ya que puede tardar
unos minutos.
8. Una vez finalizada la implementación, seleccione Ir al recurso. Se abrirá
el panel Machine Learning.
9. Seleccione Iniciar Studio, o bien vaya a https://ml.azure.com e inicie
sesión con la cuenta Microsoft. Se abrirá la página Microsoft Azure
Machine Learning Studio.
10. En Estudio de Azure Machine Learning, alterne el icono ☰ de la parte
superior izquierda para desplegar o contraer su panel de menús. Puede
usar estas opciones para administrar los recursos en el área de trabajo.
Para ejecutar el cuaderno que usará en este ejercicio, necesitará una instancia de
proceso en el área de trabajo de Azure Machine Learning.
Los archivos que se usan en este módulo (y en otros módulos relacionados) están
publicados en el repositorio MicrosoftDocs/ml-basics de GitHub. Si aún no lo ha
hecho, siga estos pasos para clonar el repositorio en su área de trabajo de Azure
Machine Learning:
cd Users
7.
8. Una vez completado el comando y finalizada la restauración de los
archivos, cierre la pestaña de terminal y vaya a la página principal del
explorador de archivos de Jupyter Notebook.
9. Abra la carpeta Users, que debe contener una carpeta ml-basics con los
archivos que usará en este módulo.
Nota
Le recomendamos usar Jupyter en un área de trabajo de Azure Machine Learning
para este ejercicio. Esta configuración garantiza la instalación de la versión correcta
de Python y de los distintos paquetes que necesitará. Además, después de crear el
área de trabajo una vez, puede volver a usarla en otros módulos. Si prefiere
completar el ejercicio en un entorno de Python en su propio equipo, puede hacerlo.
Encontrará información detallada de la configuración de un entorno de desarrollo
local que usa Visual Studio Code en la página de GitHub sobre la ejecución de
laboratorios en su propio equipo. Tenga en cuenta que, si decide hacer esto, es
posible que las instrucciones del ejercicio no coincidan con la interfaz de usuario de
sus cuadernos.
100 XP
10 minutos
Capas convolucionales
Copiar
1 -1 1
-1 0 -1
1 -1 1
Una imagen también es simplemente una matriz de valores de píxeles. Para aplicar
el filtro, debe "superponerlo" en una imagen y calcular una suma ponderada de los
valores de píxeles de la imagen correspondientes bajo el kernel del filtro. Luego, el
resultado se asigna a la celda central de una sección correspondiente de 3×3 en
una matriz de valores nueva que tiene el mismo tamaño que la imagen. Por ejemplo,
supongamos que una imagen de 6x6 tiene los valores de píxeles siguientes:
Copiar
Copiar
Copiar
? ? ? ? ? ?
? 155 ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
Copiar
? ? ? ? ? ?
? 155 -155 ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
El proceso se repite hasta que se aplica el filtro en todas las secciones de 3x3 de la
imagen a fin de generar una matriz de valores nueva como la siguiente:
Copiar
? ? ? ? ? ?
? ? ? ? ? ?
Debido al tamaño del kernel de filtro, no se pueden calcular los valores de los
píxeles del borde; por tanto, solo se suele aplicar un valor de relleno (a menudo, 0):
Copiar
0 0 0 0 0 0
0 0 0 0 0 0
Copiar
0 0 0 0 0 0
0 155 0 155 0 0
0 0 310 0 155 0
0 0 0 0 0 0
0 0 0 0 0 0
Agrupación de capas
Copiar
0 0
0 155
Tenga en cuenta que el efecto del filtro de agrupación de 2x2 es reducir el número
de valores de 4 a 1.
Al igual que con las capas convolucionales, las capas de agrupación funcionan
aplicando el filtro a toda la asignación de características. En la animación siguiente
se muestra un ejemplo de la agrupación máxima de una asignación de imágenes.
1. La asignación de características extraída por un filtro en una capa
convolucional contiene una matriz de valores de características.
2. Se usa un kernel de agrupación para reducir la cantidad de valores de
características. En este caso, el tamaño del kernel es 2x2, por lo que
generará una matriz con un cuarto de la cantidad de valores de
características.
3. El kernel de agrupación se convoluciona en la asignación de
características, conservando solo el valor de píxel más alto en cada
posición.
Capas de anulación
Uno de los mayores desafíos en una CNN es evitar el sobreajuste. Aquí, el modelo
resultante funciona bien con los datos de entrenamiento, pero no se puede
generalizar bien a los datos nuevos con los que no se entrenó. Una técnica que
puede usar para mitigar el sobreajuste es incluir capas en las que el proceso de
entrenamiento elimina (o "anula") asignaciones de características de forma
aleatoria. Esto puede parecer un poco contradictorio, pero es una manera eficaz de
asegurarse de que el modelo no aprenda a depender demasiado de las imágenes
de entrenamiento.
Otras técnicas que puede usar para mitigar el sobreajuste incluyen el volteo
aleatorio, la creación de reflejo o la distorsión de las imágenes de entrenamiento a
fin de generar datos que varíen entre las épocas de entrenamiento.
Capas de acoplamiento
Por lo general, una CNN termina con una red completamente conectada en la que
los valores de las características se transmiten a una capa de entrada, a través de
una o más capas ocultas, y generan valores previstos en una capa de salida.
100 XP
45 minutos
Transferencia de aprendizaje
Completado
100 XP
5 minutos
En la vida, a menudo resulta más fácil aprender una aptitud nueva si ya tiene
experiencia en una aptitud similar transmisible. Por ejemplo, probablemente sea
más fácil enseñar a alguien cómo conducir un autobús si ya sabe conducir un
automóvil. El conductor puede usar los conocimientos que ya tiene sobre cómo
conducir un automóvil y aplicarlos para aprender a conducir un autobús.
Al dividir la red en estos tipos de capas, es posible tomar las capas de extracción de
características de un modelo ya entrenado y adjuntar una o más capas que usen las
características extraídas para predecir las etiquetas de clase correctas para sus
imágenes. Este enfoque le permite mantener las ponderaciones entrenadas
previamente para las capas de extracción de características, lo que significa que
solo necesita entrenar las capas de predicción que agrega.
100 XP
30 minutos
En este ejercicio, usará su marco preferido para entrenar un modelo de red neuronal
convolucional mediante el aprendizaje por transferencia.
Limpieza
Si ha usado una instancia de proceso en un área de trabajo de Azure Machine
Learning para completar los ejercicios, siga estos pasos para la limpieza.
Introducción
El aprendizaje automático es la base de la mayoría de las soluciones de inteligencia
artificial. La creación de una solución inteligente empieza a veces con el uso del
aprendizaje automático para entrenar un modelo predictivo con datos históricos que
se hayan recopilado.
Azure Machine Learning es un servicio en la nube que se puede usar para entrenar
y administrar modelos de Machine Learning.
Para completar este módulo, necesitará una suscripción de Microsoft Azure. Si aún
no tiene una, puede solicitar una prueba gratuita en https://azure.microsoft.com.
Para ello, Adventure Works podría crear un modelo de Machine Learning que tome
información sobre un día específico (el día de la semana, las condiciones climáticas
previstas, etc.) como entrada y prediga el número previsto de alquileres como
salida.
f(x) = y
En el ejemplo del alquiler de bicicletas, los detalles sobre un día determinado (día de
la semana, clima, etc.) son las características (x), el número de alquileres para ese
día es la etiqueta (y) y la función (f) que calcula el número de alquileres según la
información sobre el día está encapsulada en el modelo de Machine Learning.
100 XP
5 minutos
Los destinos de proceso son recursos basados en la nube en los que se pueden
ejecutar procesos de entrenamiento de modelos y exploración de datos.
100 XP
3 minutos
100 XP
50 minutos
ntroducción
Completado
100 XP
2 minutos
Puede usar el diseñador de Microsoft Azure Machine Learning para crear modelos
de clasificación mediante una interfaz visual de arrastrar y colocar, sin necesidad de
escribir código.
Para completar este módulo, necesitará una suscripción de Microsoft Azure. Si aún
no tiene una, puede solicitar una prueba gratuita en https://azure.microsoft.com.
Identificación de escenarios de
aprendizaje automático de clasificación
Completado
100 XP
3 minutos
100 XP
4 minutos
Lo más importante es que Azure Machine Learning ayuda a los científicos de datos
a aumentar su eficiencia mediante la automatización de muchas de las tareas que
consumen mucho tiempo asociadas a los modelos de entrenamiento. Les permite
usar recursos de proceso basados en la nube que se escalan de manera eficaz para
manejar grandes volúmenes de datos, incurriendo en costes solo cuando realmente
se usan.
100 XP
6 minutos
Pipelines
Las canalizaciones permiten organizar, administrar y reutilizar flujos de trabajo de
aprendizaje automático complejos entre proyectos y usuarios. Una canalización se
inicia con el conjunto de datos desde el que quiere entrenar el modelo. Cada vez
que se ejecuta una canalización, la configuración de esta y sus resultados se
almacenan en el área de trabajo como un trabajo de canalización.
Componentes
Un componente de Azure Machine Learning encapsula un paso en una canalización
de aprendizaje automático. Puede considerar un componente como una función de
programación y como un bloque de creación para las canalizaciones de Azure
Machine Learning. En un proyecto de canalización, puede acceder a los
componentes y recursos de datos desde la pestaña Biblioteca de recursos del panel
izquierdo.
Conjuntos de datos
Puede crear recursos de datos en la página Datos a partir de archivos locales, un
almacén de datos, archivos web y Open Datasets. Estos recursos de datos
aparecerán junto con los conjuntos de datos de ejemplo estándar en la biblioteca de
recursos del diseñador.
100 XP
8 minutos
Puede pensar en los pasos para entrenar y evaluar un modelo de Machine Learning
de clasificación como los siguientes:
Entrenamiento de un modelo
Para entrenar un modelo de clasificación, necesita un conjunto de datos que incluya
características históricas, características de la entidad para la que quiere realizar
una predicción y valores de etiqueta conocidos. La etiqueta es el indicador de clase
que quiere para entrenar un modelo para predecir.
Es habitual entrenar el modelo con un subconjunto de los datos, a la vez que se
retienen algunos con los que probar el modelo entrenado. Esto le permite comparar
las etiquetas que predice el modelo con las etiquetas conocidas reales del conjunto
de datos original.
La matriz de confusión es una herramienta que se usa para evaluar la calidad de las
predicciones de un modelo de clasificación. Compara las etiquetas predichas con
las etiquetas reales.
De estas métricas, la exactitud puede ser la más intuitiva. Sin embargo, debe tener
cuidado al usar la precisión como medida del funcionamiento correcto de un modelo.
Con el modelo que predice que el 15 % de los pacientes tienen diabetes cuando en
realidad el 25 % de los pacientes la tienen podemos calcular las métricas siguientes:
La exactitud del modelo es la siguiente: (10+70)/ 100 = 80 %.
Selección de un umbral
El diseñador tiene un control deslizante para el umbral que resulta útil para revisar
cómo cambiaría el rendimiento del modelo en función del umbral establecido.
Otro término para la coincidencia es la tasa de verdaderos positivos, que tiene una
métrica correspondiente denominada tasa de falsos positivos, que mide el número
de casos negativos que se han identificado incorrectamente como positivos en
comparación con el número de casos negativos reales. Trazar estas métricas entre
sí para cada valor del umbral posible entre 0 y 1 da como resultado una curva,
conocida como curva ROC (ROC significa característica operativa del receptor, pero
la mayoría de los científicos de datos simplemente la llaman curva ROC). En un
modelo ideal, la curva ascendería por el lado izquierdo y discurriría por la parte
superior, para cubrir todo el área del gráfico. Cuanto mayor sea el área bajo la curva
de la métrica AUC (que puede ser cualquier valor comprendido entre 0 y 1), mejor
será el rendimiento del modelo. Puede revisar la curva ROC en Resultados de la
evaluación.
Implementación
100 XP
60 minutos
Introducción
Puede usar el diseñador de Microsoft Azure Machine Learning para crear modelos
de agrupación en clústeres mediante una interfaz visual de arrastrar y colocar, sin
necesidad de escribir código.
Para completar este módulo, necesitará una suscripción a Microsoft Azure. Si aún
no tiene una, puede solicitar una prueba gratuita en https://azure.microsoft.com.
Identificación de escenarios de
aprendizaje automático de agrupación
en clústeres
Completado
100 XP
2 minutos
La agrupación en clústeres es una forma de aprendizaje automático que se utiliza
para agrupar elementos similares en grupos según sus características. Por ejemplo,
un investigador podría tomar medidas de pingüinos y agruparlas en función de las
similitudes en sus proporciones.
100 XP
3 minutos
Lo más importante es que Azure Machine Learning ayuda a los científicos de datos
a aumentar su eficiencia mediante la automatización de muchas de las tareas que
consumen mucho tiempo asociadas a los modelos de entrenamiento. Les permite
usar recursos de proceso basados en la nube que se escalan de manera eficaz para
manejar grandes volúmenes de datos, incurriendo en costes solo cuando realmente
se usan.
Introducción
Azure Machine Learning es una plataforma para cargas de trabajo de aprendizaje
automático operativas en la nube.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
100 XP
5 minutos
Un área de trabajo es un contexto para los experimentos, los datos, los destinos de
proceso y otros recursos asociados a una carga de trabajo de aprendizaje
automático.
Entre los recursos de Azure que se crean junto a un área de trabajo se incluyen los
siguientes:
Python
Copiar
ws = Workspace.create(name='aml-workspace',
subscription_id='123456-abc-123...',
resource_group='aml-resources',
create_resource_group=True,
location='eastus'
)
● Use la interfaz de la línea de comandos (CLI) de Azure con la extensión
de la CLI para Azure Machine Learning. Por ejemplo, podría usar el
comando siguiente (que supone que ya se ha creado un grupo de
recursos denominado aml-resources):
Bash
Copiar
100 XP
20 minutos
Ahora puede crear un área de trabajo para empezar a usar Azure Machine Learning.
Instrucciones
Siga estas instrucciones para completar el ejercicio.
100 XP
5 minutos
Nota
Para usar Azure Machine Learning Studio, utilice un explorador web para ir a
https://ml.azure.com e inicie sesión con las credenciales asociadas a la suscripción
de Azure. Después, puede seleccionar la suscripción y el área de trabajo que quiere
administrar.
El SDK de Azure Machine Learning
Aunque las interfaces gráficas como Azure Machine Learning Studio facilitan la
creación y administración de los recursos de aprendizaje automático, a menudo es
conveniente usar un enfoque basado en código para administrarlos. Mediante la
escritura de scripts para crear y administrar recursos, puede hacer lo siguiente:
Bash
Copiar
Bash
Copiar
Más información: Para más información sobre la instalación del SDK de Python de
Azure Machine Learning, vea la documentación del SDK. Además, debe tener en
cuenta que el SDK se actualiza de forma periódica, y revisar las notas de la versión
de la versión más reciente.
JSON
Copiar
"subscription_id": "1234567-abcde-890-fgh...",
"resource_group": "aml-resources",
"workspace_name": "aml-workspace"
Sugerencia
Copiar
ws = Workspace.from_config()
Python
Copiar
ws = Workspace.get(name='aml-workspace',
subscription_id='1234567-abcde-890-fgh...',
resource_group='aml-resources')
Sea cual sea la técnica que use, si no hay ninguna sesión activa actual con la
suscripción de Azure, se le pedirá que se autentique.
Copiar
compute = ws.compute_targets[compute_name]
El SDK contiene una completa biblioteca de clases que puede usar para crear,
administrar y usar muchos tipos de recursos en un área de trabajo de Azure
Machine Learning.
Más información: Para más información sobre el SDK de Azure Machine Learning,
vea la documentación del SDK.
Para instalar la extensión de la CLI para Azure Machine Learning, primero debe
instalar la CLI de Azure. Vea las instrucciones de instalación completas para todas
las plataformas compatibles para más información.
Bash
Copiar
Para usar la extensión de la CLI para Azure Machine Learning, ejecute el comando
az ml con los parámetros adecuados para la acción que quiera realizar. Por ejemplo,
para enumerar los destinos de proceso de un área de trabajo, ejecute el comando
siguiente:
Bash
Copiar
Nota
Más información: Para más información sobre la extensión de la CLI para Azure
Machine Learning, vea la documentación del SDK.
100 XP
5 minutos
Python
Copiar
run = experiment.start_logging()
run.complete()
Una vez finalizada la ejecución del experimento, puede ver los detalles en la
pestaña Experimentos de Azure Machine Learning Studio.
Registro de métricas
Cada experimento genera archivos de registro que incluyen los mensajes que se
escribirán en el terminal durante la ejecución interactiva. Esto le permite usar
instrucciones print sencillas para escribir mensajes en el registro. Pero si quiere
registrar métricas con nombre para la comparación entre ejecuciones, puede
hacerlo mediante el objeto Run, que proporciona un intervalo de funciones de
registro específicamente para este fin. Entre ellas se incluyen las siguientes:
Más información: Para más información sobre el registro de métricas durante las
ejecuciones de experimentos, vea Supervisión de ejecuciones y métricas de
experimentos de Azure ML en la documentación de Azure Machine Learning.
Python
Copiar
import pandas as pd
run = experiment.start_logging()
data = pd.read_csv('data.csv')
row_count = (len(data))
run.complete()
Python
Copiar
RunDetails(run).show()
También puede recuperar las métricas con el método get_metrics del objeto Run,
que devuelve una representación JSON de las métricas, como se muestra aquí:
Python
Copiar
import json
metrics = run.get_metrics()
print(json.dumps(metrics, indent=2))
JSON
Copiar
"observations": 15000
Python
Copiar
run.upload_file(name='outputs/sample.csv',
path_or_stream='./sample.csv')
Sea cual sea el enfoque que use para ejecutar el experimento, puede recuperar una
lista de archivos de salida desde el objeto Run de esta forma:
Python
Copiar
import json
files = run.get_file_names()
print(json.dumps(files, indent=2))
JSON
Copiar
"outputs/sample.csv"
Python
Copiar
import pandas as pd
run = Run.get_context()
data = pd.read_csv('data.csv')
row_count = (len(data))
run.log('observations', row_count)
os.makedirs('outputs', exist_ok=True)
data.sample(100).to_csv("outputs/sample.csv", index=False,
header=True)
run.complete()
Python
Copiar
from azureml.core import Experiment, ScriptRunConfig
script_config =
ScriptRunConfig(source_directory=experiment_folder,
script='experiment.py')
run = experiment.submit(config=script_config)
run.wait_for_completion(show_output=True)
Nota
100 XP
20 minutos
Entrenamiento de un modelo de
Machine Learning con Azure Machine
Learning
Obtenga información sobre cómo usar Azure Machine Learning para entrenar un
modelo y registrarlo en un área de trabajo.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Python
Copiar
from azureml.core import Run
import pandas as pd
import numpy as np
import joblib
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# calculate accuracy
y_hat = model.predict(X_test)
acc = np.average(y_hat == y_test)
run.log('Accuracy', np.float(acc))
run.complete()
Python
Copiar
from azureml.core import Experiment, ScriptRunConfig, Environment
from azureml.core.conda_dependencies import CondaDependencies
pip_packages=['azureml-defaults'])
sklearn_env.python.conda_dependencies = packages
100 XP
5 minutos
Python
Copiar
from azureml.core import Run
import argparse
import pandas as pd
import numpy as np
import joblib
import os
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# calculate accuracy
y_hat = model.predict(X_test)
acc = np.average(y_hat == y_test)
run.log('Accuracy', np.float(acc))
Python
Copiar
# Create a script config
script_config =
ScriptRunConfig(source_directory='training_folder',
script='training.py',
arguments = ['--reg-rate', 0.1],
environment=sklearn_env)
100 XP
5 minutos
Python
Copiar
# "run" is a reference to a completed experiment run
Registro de un modelo
El registro de modelos permite realizar el seguimiento de varias versiones de un
modelo y recuperar modelos para la inferencia (la predicción de valores de etiqueta
a partir de datos nuevos). Al registrar un modelo, puede especificar un nombre, una
descripción, etiquetas, un marco de trabajo (como Scikit-Learn o PyTorch), una
versión del marco, propiedades personalizadas y otros metadatos útiles. Al registrar
un modelo con el mismo nombre que otro existente, se crea automáticamente una
versión del modelo, que comienza en 1 y aumenta en unidades de 1.
Para registrar un modelo desde un archivo local, puede usar el método register del
objeto Model tal y como se muestra aquí:
Python
Copiar
from azureml.core import Model
model = Model.register(workspace=ws,
model_name='classification_model',
model_path='model.pkl', # local path
description='A classification model',
tags={'data-format': 'CSV'},
model_framework=Model.Framework.SCIKITLEARN,
model_framework_version='0.20.3')
Como alternativa, si tiene una referencia al elemento Run usado para entrenar el
modelo, puede usar su método register_model, tal y como se muestra aquí:
Python
Copiar
run.register_model( model_name='classification_model',
model_path='outputs/model.pkl', # run outputs
path
description='A classification model',
tags={'data-format': 'CSV'},
model_framework=Model.Framework.SCIKITLEARN,
model_framework_version='0.20.3')
Puede ver los modelos registrados en Azure Machine Learning Studio. También
puede usar el objeto Model para recuperar los detalles de los modelos registrados
de esta forma:
Python
Copiar
from azureml.core import Model
100 XP
20 minutos
Introducción
Completado
100 XP
2 minutos
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
100 XP
5 minutos
Nota: para consultar una lista completa de los almacenes de datos admitidos,
consulte la documentación de Azure Machine Learning.
100 XP
5 minutos
Python
Copiar
from azureml.core import Workspace, Datastore
ws = Workspace.from_config()
datastore_name='blob_data',
container_name='data_container',
account_name='az_store_acct',
account_key='123456abcde789…')
Python
Copiar
for ds_name in ws.datastores:
print(ds_name)
Python
Copiar
blob_store = Datastore.get(ws, datastore_name='blob_data')
Python
Copiar
default_store = ws.get_default_datastore()
Python
Copiar
ws.set_default_datastore('blob_data')
100 XP
5 minutos
Los conjuntos de datos son la principal forma de pasar datos a experimentos que entrenan
modelos.
Copiar
df = tab_ds.to_pandas_dataframe()
# code to work with dataframe goes here, for example:
print(df.head())
Cuando tenga que acceder a un conjunto de datos de un script de experimento, debe pasar
el conjunto de datos al script. Puede hacerlo de dos formas.
Puede pasar un conjunto de datos tabulares como un argumento de script. Al tomar este
enfoque, el argumento recibido por el script es el identificador único para el conjunto de
datos de su área de trabajo. En el script, puede ver el área de trabajo desde el contexto de
ejecución y utilizarlo para recuperar el conjunto de datos por su identificador.
ScriptRunConfig:
Copiar
env = Environment('my_env')
packages = CondaDependencies.create(conda_packages=['pip'],
pip_packages=['azureml-defaults',
'azureml-dataprep[pandas]'])
env.python.conda_dependencies = packages
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
arguments=['--ds', tab_ds],
environment=env)
Script:
Copiar
from azureml.core import Run, Dataset
run = Run.get_context()
ws = run.experiment.workspace
dataset = Dataset.get_by_id(ws, id=args.dataset_id)
data = dataset.to_pandas_dataframe()
También puede pasar un conjunto de datos tabulares como entrada con nombre. Si toma
ese enfoque, usará el método as_named_input del conjunto de datos para especificar un
nombre para el conjunto de datos. Después, en el script, puede recuperar el conjunto de
datos por nombre desde la colección input_datasets del contexto de ejecución sin
necesidad de recuperarlo del área de trabajo. Tenga en cuenta que, si usa este enfoque,
todavía tendrá que incluir un argumento de script para el conjunto de datos, aunque
realmente no lo use para recuperar el conjunto de datos.
ScriptRunConfig:
Copiar
env = Environment('my_env')
packages = CondaDependencies.create(conda_packages=['pip'],
pip_packages=['azureml-defaults',
'azureml-dataprep[pandas]'])
env.python.conda_dependencies = packages
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
arguments=['--ds', tab_ds.as_named_input('my_dataset')],
environment=env)
Script:
Copiar
from azureml.core import Run
run = Run.get_context()
dataset = run.input_datasets['my_dataset']
data = dataset.to_pandas_dataframe()
Copiar
for file_path in file_ds.to_path():
print(file_path)
Igual que con un conjunto de datos tabulares, hay dos formas de pasar un conjunto de
datos de archivo a un script. Pero hay algunas diferencias importantes en la forma en que
se pasa el conjunto de datos.
Copiar
env = Environment('my_env')
packages = CondaDependencies.create(conda_packages=['pip'],
pip_packages=['azureml-defaults',
'azureml-dataprep[pandas]'])
env.python.conda_dependencies = packages
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
arguments=['--ds', file_ds.as_download()],
environment=env)
Script:
Copiar
from azureml.core import Run
import glob
También puede pasar un conjunto de datos de archivo como una entrada con nombre. En
este enfoque, se usa el método as_named_input del conjunto de datos para especificar un
nombre antes de especificar el modo de acceso. Después, en el script, puede recuperar el
conjunto de datos por nombre de la colección input_datasets del contexto de ejecución y
leer los archivos desde allí. Igual que con los conjuntos de datos tabulares, si usa este
enfoque, todavía tendrá que incluir un argumento de script para el conjunto de datos,
aunque realmente no lo use para recuperar el conjunto de datos.
ScriptRunConfig:
Copiar
env = Environment('my_env')
packages = CondaDependencies.create(conda_packages=['pip'],
pip_packages=['azureml-defaults',
'azureml-dataprep[pandas]'])
env.python.conda_dependencies = packages
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
arguments=['--ds', file_ds.as_named_input('my_ds').as_download()],
environment=env)
Script:
Copiar
from azureml.core import Run
import glob
dataset = run.input_datasets['my_ds']
imgs= glob.glob(dataset + "/*.jpg")
● Tabular: los datos se leen desde el conjunto de datos como una tabla.
Debe usar este tipo de conjunto de datos cuando los datos están
estructurados de forma coherente y quiere trabajar con ellos en
estructuras de datos tabulares comunes, como DataFrames de Pandas.
● Archivo: el conjunto de datos presenta una lista de rutas de acceso a
archivos que se pueden leer como si fueran del sistema de archivos.
Utilice este tipo de conjunto de datos cuando los datos no estén
estructurados o cuando necesite procesar los datos en el nivel de
archivo (por ejemplo, para entrenar una red neuronal de circunvolución
desde un conjunto de archivos de imagen).
Python
Copiar
from azureml.core import Dataset
blob_ds = ws.get_default_datastore()
csv_paths = [(blob_ds, 'data/files/current_data.csv'),
(blob_ds, 'data/files/archive/*.csv')]
tab_ds = Dataset.Tabular.from_delimited_files(path=csv_paths)
tab_ds = tab_ds.register(workspace=ws, name='csv_table')
Python
Copiar
from azureml.core import Dataset
blob_ds = ws.get_default_datastore()
file_ds = Dataset.File.from_files(path=(blob_ds,
'data/files/images/*.jpg'))
file_ds = file_ds.register(workspace=ws, name='img_files')
El conjunto de datos de este ejemplo incluye todos los archivos .jpg de la ruta de
acceso data/files/images dentro del almacén de datos predeterminado.
Python
Copiar
import azureml.core
from azureml.core import Workspace, Dataset
Puede crear una nueva versión de un conjunto de datos registrándola con el mismo
nombre que un conjunto de datos previamente registrado y especificando la
propiedad create_new_version:
Python
Copiar
img_paths = [(blob_ds, 'data/files/images/*.jpg'),
(blob_ds, 'data/files/images/*.png')]
file_ds = Dataset.File.from_files(path=img_paths)
file_ds = file_ds.register(workspace=ws, name='img_files',
create_new_version=True)
Python
Copiar
img_ds = Dataset.get_by_name(workspace=ws, name='img_files',
version=2)
100 XP
20 minutos
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
Completado
100 XP
2 minutos
● El entorno del script, que incluye todos los paquetes de los que
depende el script.
● El destino de proceso en el que se implementará el entorno y la
ejecución del script.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
100 XP
5 minutos
Creación de entornos
Hay varias maneras de crear entornos en Azure Machine Learning.
Puede usar un archivo de especificación Conda o PIP para definir los paquetes
necesarios en un entorno de Python y usarlo para crear un objeto de entorno.
Bash
Copiar
name: py_env
dependencies:
- numpy
- pandas
- scikit-learn
- pip:
- azureml-defaults
Después, puede usar el código siguiente para crear un entorno de Azure Machine
Learning a partir del archivo de especificación guardado:
Python
Copiar
from azureml.core import Environment
env =
Environment.from_conda_specification(name='training_environment',
file_path='./conda.yml')
Python
Copiar
from azureml.core import Environment
env =
Environment.from_existing_conda_environment(name='training_environ
ment',
conda_environment_name='py_env')
Puede definir un entorno especificando los paquetes Conda y PIP que necesita en
un objeto CondaDependencies, como se indica a continuación:
Python
Copiar
from azureml.core import Environment
from azureml.core.conda_dependencies import CondaDependencies
env = Environment('training_environment')
deps =
CondaDependencies.create(conda_packages=['scikit-learn','pandas','
numpy'],
pip_packages=['azureml-defaults'])
env.python.conda_dependencies = deps
Configuración de contenedores de entorno
Normalmente, los entornos para el script de experimento se crean en contenedores.
El código siguiente configura un experimento basado en script para hospedar el
entorno env creado anteriormente en un contenedor (este es el valor
predeterminado a menos que use DockerConfiguration con un atributo use_docker
de False, en cuyo caso el entorno se crea directamente en el destino de proceso).
Python
Copiar
from azureml.core import Experiment, ScriptRunConfig
from azureml.core.runconfig import DockerConfiguration
docker_config = DockerConfiguration(use_docker=True)
script_config = ScriptRunConfig(source_directory='my_folder',
script='my_script.py',
environment=env,
docker_runtime_config=docker_config)
Azure Machine Learning usa una biblioteca de imágenes base para los
contenedores y elige la base adecuada para el destino de proceso que especifique
(por ejemplo, incluida la compatibilidad con Cuda para el proceso basado en GPU).
Si ha creado imágenes de contenedor personalizadas y las ha registrado en un
registro de contenedor, puede invalidar las imágenes base predeterminadas y usar
las suyas propias modificando los atributos de la propiedad docker del entorno.
Python
Copiar
env.docker.base_image='my-base-image'
env.docker.base_image_registry='myregistry.azurecr.io/myimage'
Como alternativa, puede hacer que una imagen se cree a petición en función de la
imagen base y la configuración adicional en un Dockerfile.
Python
Copiar
env.docker.base_image = None
env.docker.base_dockerfile = './Dockerfile'
De manera predeterminada, Azure Machine Learning administra las rutas de acceso
y las dependencias de paquetes de Python. Si la imagen ya incluye una instalación
de Python con las dependencias que necesita, puede invalidar este comportamiento
estableciendo python.user_managed_dependencies en True y estableciendo una
ruta de acceso de Python explícita para la instalación.
Python
Copiar
env.python.user_managed_dependencies=True
env.python.interpreter_path = '/opt/miniconda/bin/python'
Registro de un entorno
Python
Copiar
env.register(workspace=ws)
Python
Copiar
from azureml.core import Environment
env_names = Environment.list(workspace=ws)
for env_name in env_names:
print('Name:',env_name)
Python
Copiar
training_env = Environment.get(workspace=ws,
name='training_environment')
script_config = ScriptRunConfig(source_directory='my_folder',
script='my_script.py',
environment=training_env)
100 XP
5 minutos
En Azure Machine Learning, los destinos de proceso son equipos físicos o virtuales
en los que se ejecutan los experimentos.
Tipos de proceso
Azure Machine Learning admite varios tipos de proceso para la experimentación y el
entrenamiento. Esto le permite seleccionar el tipo más adecuado de destino de
proceso para sus necesidades concretas.
Nota
100 XP
5 minutos
Las formas más comunes de crear o adjuntar un destino de proceso son usar la
página Proceso en Estudio de Azure Machine Learning Studio o usar el SDK de
Azure Machine Learning para aprovisionar destinos de proceso en el código.
Python
Copiar
from azureml.core import Workspace
from azureml.core.compute import ComputeTarget, AmlCompute
min_nodes=0, max_nodes=4,
vm_priority='dedicated')
Por ejemplo, el código siguiente puede usarse para asociar un clúster de Azure
Databricks existente:
Python
Copiar
from azureml.core import Workspace
from azureml.core.compute import ComputeTarget, DatabricksCompute
access_token=db_access_token)
Python
Copiar
from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException
compute_name = "aml-cluster"
max_nodes=4)
aml_cluster = ComputeTarget.create(ws, compute_name,
compute_config)
aml_cluster.wait_for_completion(show_output=True)
100 XP
5 minutos
Python
Copiar
from azureml.core import Environment, ScriptRunConfig
compute_name = 'aml-cluster'
training_env = Environment.get(workspace=ws,
name='training_environment')
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
environment=training_env,
compute_target=compute_name)
Python
Copiar
from azureml.core import Environment, ScriptRunConfig
from azureml.core.compute import ComputeTarget
compute_name = "aml-cluster"
script_config = ScriptRunConfig(source_directory='my_dir',
script='script.py',
environment=training_env,
compute_target=training_cluster)
100 XP
20 minutos
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
Completado
100 XP
2 minutos
Objetivos de aprendizaje
En este módulo aprenderá a:
100 XP
5 minutos
Pasos de la canalización
Una canalización Azure Machine Learning se compone de uno o varios pasos que
realizan tareas. Hay muchos tipos de pasos admitidos por las canalizaciones de
Azure Machine Learning, cada uno con sus propias opciones de configuración y
propósito especializadas.
Entre los tipos comunes de paso de una canalización de Azure Machine Learning
figuran los siguientes:
Nota: Para obtener una lista completa de los tipos de pasos admitidos, consulte la
documentación del paquete azure.pipeline.steps.
Para crear una canalización, primero debe definir cada paso y, después, crear una
canalización que incluya los pasos. La configuración específica de cada paso
depende del tipo de paso. Por ejemplo, el código siguiente define dos pasos
PythonScriptStep para preparar los datos y, a continuación, entrenar un modelo.
Python
Copiar
from azureml.pipeline.steps import PythonScriptStep
Python
Copiar
from azureml.pipeline.core import Pipeline
from azureml.core import Experiment
100 XP
5 minutos
El objeto OutputFileDatasetConfig
El objeto OutputFileDatasetConfig es un tipo especial de conjunto de datos que:
Python
Copiar
from azureml.data import OutputFileDatasetConfig
from azureml.pipeline.steps import PythonScriptStep, EstimatorStep
Python
Copiar
# code in data_prep.py
from azureml.core import Run
import argparse
import os
# Get arguments
parser = argparse.ArgumentParser()
parser.add_argument('--raw-ds', type=str, dest='raw_dataset_id')
parser.add_argument('--out_folder', type=str, dest='folder')
args = parser.parse_args()
output_folder = args.folder
# code to prep data (in this case, just select specific columns)
prepped_df = raw_df[['col1', 'col2', 'col3']]
100 XP
5 minutos
Las canalizaciones con varios pasos de ejecución prolongada pueden tardar mucho
tiempo en completarse. Azure Machine Learning incluye algunas características de
almacenamiento en caché y reutilización para reducir este tiempo.
Python
Copiar
step1 = PythonScriptStep(name = 'prepare data',
source_directory = 'scripts',
script_name = 'data_prep.py',
compute_target = 'aml-cluster',
runconfig = run_config,
inputs=[raw_ds.as_named_input('raw_data')],
outputs=[prepped_data],
arguments = ['--folder', prepped_data]),
# Disable step reuse
allow_reuse = False)
Python
Copiar
pipeline_run = experiment.submit(train_pipeline,
regenerate_outputs=True)
Publicación de canalizaciones
Completado
100 XP
5 minutos
Python
Copiar
published_pipeline = pipeline.publish(name='training_pipeline',
description='Model
training pipeline',
version='1.0')
Python
Copiar
# Get the most recent run of the pipeline
pipeline_experiment = ws.experiments.get('training-pipeline')
run = list(pipeline_experiment.get_runs())[0]
Python
Copiar
rest_endpoint = published_pipeline.endpoint
print(rest_endpoint)
Por ejemplo, el siguiente código de Python realiza una solicitud REST para ejecutar
una canalización y muestra el identificador de ejecución devuelto.
Python
Copiar
import requests
response = requests.post(rest_endpoint,
headers=auth_header,
json={"ExperimentName":
"run_training_pipeline"})
run_id = response.json()["Id"]
print(run_id)
Uso de parámetros de canalización
Completado
100 XP
5 minutos
Por ejemplo, podría usar el código siguiente para incluir un parámetro para una tasa
de regularización en el script utilizado por un estimador:
Python
Copiar
from azureml.pipeline.core.graph import PipelineParameter
...
Nota
Python
Copiar
response = requests.post(rest_endpoint,
headers=auth_header,
json={"ExperimentName":
"run_training_pipeline",
"ParameterAssignments":
{"reg_rate": 0.1}})
Programar canalizaciones
Completado
100 XP
5 minutos
Por ejemplo, el código siguiente programa una ejecución diaria de una canalización
publicada.
Python
Copiar
from azureml.pipeline.core import ScheduleRecurrence, Schedule
pipeline_id=published_pipeline.id,
experiment_name='Training_Pipeline',
recurrence=daily)
Desencadenamiento de una ejecución de canalización
con cambios de datos
Para programar la ejecución de una canalización cada vez que cambien los datos,
debe crear una programación que supervise una ruta de acceso especificada en un
almacén de datos, de la siguiente manera:
Python
Copiar
from azureml.core import Datastore
from azureml.pipeline.core import Schedule
pipeline_id=published_pipeline.id,
experiment_name='Training_Pipeline',
datastore=training_datastore,
path_on_datastore='data/training')
100 XP
20 minutos
Instrucciones
Siga estas instrucciones para completar el ejercicio.
1. Si todavía no tiene una suscripción de Azure, suscríbase para disfrutar
de una prueba gratuita en https://azure.microsoft.com.
2. Vea el repositorio de ejercicios en https://aka.ms/mslearn-dp100.
3. Si todavía no lo ha hecho, complete el ejercicio Creación de un área de
trabajo de Azure Machine Learning para crear un área de trabajo de
Azure Machine Learning, crear una instancia de proceso y clonar los
archivos necesarios.
4. Complete el ejercicio Creación de una canalización.
Implementación de servicios de
aprendizaje automático en tiempo real
con Azure Machine Learning
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Introducción
Completado
100 XP
2 minutos
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
100 XP
5 minutos
Puede implementar un modelo como servicio web en tiempo real en varios tipos de
destino de proceso, incluido el proceso local, una instancia de proceso de Azure
Machine Learning, un servicio de Azure Container Instance (ACI), un clúster de
Azure Kubernetes Service (AKS), una función de Azure o un módulo de Internet de
las cosas (IoT). Azure Machine Learning usa contenedores como mecanismo de
implementación, que empaqueta el modelo y el código para usarlo como una
imagen que se puede implementar en un contenedor del destino de proceso elegido.
Nota
Para registrar un modelo desde un archivo local, puede usar el método register del
objeto Model tal y como se muestra aquí:
Python
Copiar
classification_model = Model.register(workspace=ws,
model_name='classification_model',
Como alternativa, si tiene una referencia al elemento Run usado para entrenar el
modelo, puede usar su método register_model, tal y como se muestra aquí:
Python
Copiar
run.register_model( model_name='classification_model',
Python
Copiar
import json
import joblib
import numpy as np
import os
# Called when the service is loaded
def init():
global model
model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'),
'model.pkl')
model = joblib.load(model_path)
def run(raw_data):
data = np.array(json.loads(raw_data)['data'])
predictions = model.predict(data)
return predictions.tolist()
Guarde el script en una carpeta para que pueda identificarlo fácilmente en el futuro.
Por ejemplo, puede guardar el script anterior como score.py en una carpeta
denominada service_files.
Creación de un entorno
Python
Copiar
service_env.python.conda_dependencies.add_pip_package(package)
Python
Copiar
classifier_inference_config = InferenceConfig(source_directory =
'service_files',
entry_script="score.py",
environment=service_env)
Python
Copiar
compute_config =
AksCompute.provisioning_configuration(location='eastus')
production_cluster.wait_for_completion(show_output=True)
Python
Copiar
classifier_deploy_config =
AksWebservice.deploy_configuration(cpu_cores = 1,
memory_gb = 1)
El código para configurar una implementación de ACI es similar, salvo que no hay
que crear explícitamente un destino de proceso ACI y se debe usar la clase
deploy_configuration del espacio de nombres
azureml.core.webservice.AciWebservice. Del mismo modo, puede usar el espacio
de nombres azureml.core.webservice.LocalWebservice para configurar un servicio
basado en Docker local.
Nota
Python
Copiar
model = ws.models['classification_model']
service = Model.deploy(workspace=ws,
name = 'classifier-service',
models = [model],
inference_config =
classifier_inference_config,
deployment_config =
classifier_deploy_config,
deployment_target = production_cluster)
service.wait_for_deployment(show_output = True)
5 minutos
JSON
Copiar
"data":[
...
La respuesta del método run es una colección JSON con una predicción para cada
caso que se envió en los datos. En el ejemplo de código siguiente se llama a un
servicio y se muestra la respuesta:
Python
Copiar
import json
x_new = [[0.1,2.3,4.1,2.0],
[0.2,1.8,3.9,2.1]]
predictions = json.loads(response)
for i in range(len(x_new)):
Python
Copiar
endpoint = service.scoring_uri
print(endpoint)
Con el punto de conexión conocido, puede usar una solicitud HTTP POST con datos
JSON para llamar al servicio. En el ejemplo siguiente se muestra cómo hacerlo con
Python:
Python
Copiar
import requests
import json
x_new = [[0.1,2.3,4.1,2.0],
[0.2,1.8,3.9,2.1]]
request_headers = { 'Content-Type':'application/json' }
data = json_data,
headers = request_headers)
predictions = json.loads(response.json())
Authentication
Python
Copiar
Para realizar una llamada autenticada al punto de conexión de REST del servicio,
debe incluir la clave o el token en el encabezado de solicitud de la siguiente manera:
Python
Copiar
import requests
import json
x_new = [[0.1,2.3,4.1,2.0],
[0.2,1.8,3.9,2.1]]
request_headers = { "Content-Type":"application/json",
data = json_data,
headers = request_headers)
predictions = json.loads(response.json())
for i in range(len(x_new)):
100 XP
5 minutos
Hay gran cantidad de elementos en una implementación del servicio en tiempo real,
como el modelo entrenado, la configuración del entorno en tiempo de ejecución, el
script de puntuación, la imagen de contenedor y el host del contenedor. La solución
de problemas de una implementación con errores o de un error al consumir un
servicio implementado puede resultar compleja.
Python
Copiar
print(service.state)
Nota
Para ver el estado de un servicio, debe usar el tipo de servicio específico del
proceso (por ejemplo AksWebservice) y no un objeto WebService genérico.
Python
Copiar
print(service.get_logs())
Python
Copiar
deployment_config =
LocalWebservice.deploy_configuration(port=8890)
Python
Copiar
print(service.run(input_data = json_data))
Después puede solucionar problemas en tiempo de ejecución realizando cambios
en el archivo de puntuación al que se hace referencia en la configuración de
inferencia y volviendo a cargar el servicio sin tener que volver a implementarlo (algo
que solo se puede hacer con un servicio local):
Python
Copiar
service.reload()
print(service.run(input_data = json_data))
Instrucciones
Siga estas instrucciones para completar el ejercicio:
Introducción
En muchos escenarios de producción, las tareas de ejecución prolongada que
operan en grandes volúmenes de datos se realizan como operaciones por lotes. En
el aprendizaje automático, la inferencia por lotes se usa para aplicar un modelo
predictivo a varios casos de forma asincrónica; normalmente escribiendo los
resultados en un archivo o base de datos.
En Azure Machine Learning, puede implementar soluciones de inferencia por lotes
mediante la creación de una canalización que incluya un paso para leer los datos de
entrada, cargar un modelo registrado, predecir etiquetas y escribir los resultados
como salida.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
1. Registrar un modelo
Para usar un modelo entrenado en una canalización de inferencia por lotes, debe
registrarlo en el área de trabajo de Azure Machine Learning.
Para registrar un modelo desde un archivo local, puede usar el método register del
objeto Model tal y como se muestra en el siguiente código de ejemplo:
Python
Copiar
classification_model = Model.register(workspace=your_workspace,
model_name='classification_model',
model_path='model.pkl', #
local path
description='A
classification model')
Como alternativa, si tiene una referencia al elemento Run usado para entrenar el
modelo, puede usar su método register_model, tal y como se muestra en el
siguiente código de ejemplo:
Python
Copiar
run.register_model( model_name='classification_model',
Python
Copiar
import os
import numpy as np
import joblib
def init():
global model
model_path = Model.get_model_path('classification_model')
model = joblib.load(model_path)
def run(mini_batch):
resultList = []
for f in mini_batch:
resultList.append("{}: {}".format(os.path.basename(f),
prediction[0]))
return resultList
Python
Copiar
batch_data_set = ws.datasets['batch-data']
output_dir = OutputFileDatasetConfig(name='inferences')
parallel_run_config = ParallelRunConfig(
source_directory='batch_scripts',
entry_script="batch_scoring_script.py",
mini_batch_size="5",
error_threshold=10,
output_action="append_row",
environment=batch_env,
compute_target=aml_cluster,
node_count=4)
parallelrun_step = ParallelRunStep(
name='batch-score',
parallel_run_config=parallel_run_config,
inputs=[batch_data_set.as_named_input('batch_data')],
output=output_dir,
arguments=[],
allow_reuse=True
Python
Copiar
pipeline_run.wait_for_completion(show_output=True)
prediction_run = next(pipeline_run.get_children())
prediction_output = prediction_run.get_output_data('inferences')
prediction_output.download(local_path='results')
if file.endswith('parallel_run_step.txt'):
result_file = os.path.join(root,file)
print(df)
Python
Copiar
published_pipeline =
pipeline_run.publish_pipeline(name='Batch_Prediction_Pipeline',
description='Batch pipeline',
version='1.0')
rest_endpoint = published_pipeline.endpoint
Una vez publicada, puede usar el punto de conexión de servicio para iniciar un
trabajo de inferencia por lotes, como se muestra en el código de ejemplo siguiente:
Python
Copiar
import requests
response = requests.post(rest_endpoint,
headers=auth_header,
json={"ExperimentName":
"Batch_Prediction"})
run_id = response.json()["Id"]
Python
Copiar
description='batch
inferencing',
pipeline_id=published_pipeline.id,
experiment_name='Batch_Prediction',
recurrence=weekly)
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Resumen
En este módulo ha aprendido a:
Introducción
En el aprendizaje automático, los modelos se entrenan para predecir etiquetas
desconocidas para los datos nuevos en función de las correlaciones entre las
etiquetas conocidas y las características que se encuentran en los datos de
entrenamiento. Según el algoritmo usado, es posible que tengan que especificar
hiperparámetros para configurar cómo se entrena el modelo. Por ejemplo, el
algoritmo de regresión logística utiliza un hiperparámetro de tasa de regularización
para contrarrestar el sobreajuste. Además, las técnicas de aprendizaje profundo de
las redes neuronal convolucionales (CNN) usan hiperparámetros como la velocidad
de aprendizaje a fin de controlar cómo se ajustan las ponderaciones durante el
entrenamiento y el tamaño del lote para determinar el número de elementos de
datos que se incluyen en cada lote de entrenamiento.
Nota
Ajuste de hiperparámetros
El ajuste de los hiperparámetros se logra mediante el entrenamiento de varios
modelos, con el mismo algoritmo y los mismos datos de entrenamiento, pero con
distintos valores de hiperparámetros. A continuación, el modelo que resulta de cada
ejecución de entrenamiento se evalúa para determinar la métrica de rendimiento
para la que desea realizar la optimización (por ejemplo, precisión) y se selecciona el
modelo de mejor rendimiento.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Hiperparámetros discretos
Algunos hiperparámetros requieren valores discretos; en otras palabras, debe
seleccionar el valor de un conjunto determinado de posibilidades. Puede definir un
espacio de búsqueda de un parámetro discreto mediante una opción de una lista de
valores explícitos, que puede definir como una lista de Python (), un rango () o un
conjunto arbitrario de valores separados por comas ().
● qnormal
● quniform
● qlognormal
● qloguniform
Hiperparámetros continuos
Algunos hiperparámetros son continuos; en otras palabras, puede usar cualquier
valor a lo largo de una escala. Si desea definir un espacio de búsqueda para estos
tipos de valor, puede usar cualquiera de los tipos de distribución siguientes:
● normal
● uniforme
● lognormal
● loguniform
Python
Copiar
param_space = {
'--learning_rate': normal(10, 3)
Muestreo de cuadrícula
El muestreo de cuadrícula solo se puede utilizar cuando todos los hiperparámetros
son discretos y se usa para probar cada combinación posible de parámetros en el
espacio de búsqueda.
Python
Copiar
param_space = {
param_sampling = GridParameterSampling(param_space)
Muestreo aleatorio
El muestreo aleatorio se usa para seleccionar aleatoriamente un valor para cada
hiperparámetro, que puede ser una combinación de valores discretos y continuos,
tal como se muestra en el ejemplo de código siguiente:
Python
Copiar
param_space = {
'--learning_rate': normal(10, 3)
param_sampling = RandomParameterSampling(param_space)
Muestreo bayesiano
El muestreo bayesiano elige los valores de hiperparámetro basados en el algoritmo
de optimización bayesiano, que intenta seleccionar combinaciones de parámetros
que mejorarán el rendimiento con respecto a la selección anterior. En el ejemplo de
código siguiente se muestra cómo configurar el muestreo bayesiano:
Python
Copiar
from azureml.train.hyperdrive import BayesianParameterSampling,
choice, uniform
param_space = {
param_sampling = BayesianParameterSampling(param_space)
Solo puede utilizar el muestreo bayesiano con las expresiones de parámetro choice,
uniformy quniform, y no puede combinarla con una directiva de terminación
anticipada.
Directiva de bandidos
Puede usar una directiva de bandidos para detener una ejecución si la métrica de
rendimiento de destino realiza la mejor ejecución hasta ahora según un margen
especificado.
Python
Copiar
evaluation_interval=1,
delay_evaluation=5)
Este ejemplo aplica la directiva para cada iteración después de las cinco primeras y
abandona las ejecuciones en las que la métrica de destino informada es 0,2 o es
peor que la ejecución de mejor rendimiento después del mismo número de
intervalos.
Python
Copiar
delay_evaluation=5)
Python
Copiar
early_termination_policy =
TruncationSelectionPolicy(truncation_percentage=10,
evaluation_interval=1,
delay_evaluation=5)
Python
Copiar
import argparse
import joblib
from azureml.core import Run
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
run.complete()
Nota
Python
Copiar
from azureml.core import Experiment
from azureml.train.hyperdrive import HyperDriveConfig,
PrimaryMetricGoal
hyperdrive = HyperDriveConfig(run_config=script_config,
hyperparameter_sampling=param_sampling,
policy=None,
primary_metric_name='Accuracy',
primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
max_total_runs=6,
max_concurrent_runs=4)
Python
Copiar
for child_run in run.get_children():
print(child_run.id, child_run.get_metrics())
Python
Copiar
for child_run in
hyperdrive_run.get_children_sorted_by_primary_metric():
print(child_run)
Copiar
best_run = hyperdrive_run.get_best_run_by_primary_metric()
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
ML automatizado le permite probar varios algoritmos y transformaciones de
preprocesamiento con sus datos. Esto, combinado con un proceso escalable
basado en la nube, permite encontrar el mejor modelo de rendimiento para los datos
sin la enorme cantidad de tiempo de ensayo y error manual que de otro modo sería
necesario.
● clasificación
● Regresión
● Previsión de series temporales
Algoritmos de clasificación
● Regresión logística
● Máquina de potenciación del gradiente ligera (GBM)
● Árbol de decisión
● Bosque aleatorio
● Bayes naive
● Máquina de vectores de soporte lineal (SVM)
● XGBoost
● Clasificador de redes neuronales profundas (DNN)
● Otras...
Algoritmos de regresión
● Regresión lineal
● Máquina de potenciación del gradiente ligera (GBM)
● Árbol de decisión
● Bosque aleatorio
● Red elástica
● Lazo LARS
● XGBoost
● Otras...
Algoritmos de previsión
● Regresión lineal
● Máquina de potenciación del gradiente ligera (GBM)
● Árbol de decisión
● Bosque aleatorio
● Red elástica
● Lazo LARS
● XGBoost
● Otras...
Más información: puede encontrar una lista completa de los algoritmos admitidos en
Definición de una tarea de aprendizaje automático.
Preprocesamiento y caracterización
Además de probar una selección de algoritmos, ML automatizado puede aplicar
transformaciones de preprocesamiento a los datos; lo que mejora el rendimiento del
modelo.
Escalado y normalización
ML automatizado aplica escalado y normalización automáticamente a los datos
numéricos, lo que ayuda a evitar que las características a gran escala dominen el
entrenamiento. Durante un experimento de ML automatizado, se aplicarán varias
técnicas de escalado o normalización.
Caracterización opcional
Puede elegir que el aprendizaje automático automatizado aplique el procesamiento
previo de transformaciones, como:
Ejecución de experimentos de ML
automatizado
Para ejecutar un experimento de ML automatizado, puede usar la interfaz de usuario
de Azure Machine Learning Studio o enviar un experimento mediante el SDK.
Python
Copiar
automl_run_config = RunConfiguration(framework='python')
automl_config = AutoMLConfig(name='Automated ML Experiment',
task='classification',
primary_metric = 'AUC_weighted',
compute_target=aml_compute,
training_data = train_dataset,
validation_data = test_dataset,
label_column_name='Label',
featurization='auto',
iterations=12,
max_concurrent_iterations=4)
ML automatizado está diseñado para permitirle simplemente traer sus datos y que
Azure Machine Learning averigüe la mejor manera de entrenar un modelo a partir de
ellos.
O bien:
Python
Copiar
get_primary_metrics('classification')
Más información: puede encontrar una lista completa de las métricas principales y
sus definiciones en Descripción de los resultados de aprendizaje automático
automatizado.
Python
Copiar
automl_run = automl_experiment.submit(automl_config)
Puede supervisar las ejecuciones de experimentos de ML automatizado en Azure
Machine Learning Studio o en el widget RunDetails de instancias de Jupyter
Notebook.
Python
Copiar
best_run_metrics = best_run.get_metrics()
metric = best_run_metrics[metric_name]
print(metric_name, metric)
Python
Copiar
print(step_)
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Nota
InicioSumar
Introducción
Los proyectos de ciencia de datos, incluidos los proyectos de aprendizaje
automático, implican análisis de datos, y dicha información suele incluir datos
personales confidenciales que deben mantenerse privados. En la práctica, la
mayoría de los informes que se publican a partir de los datos incluyen agregaciones
de los datos, lo que puede pensar que proporcionaría cierta privacidad: después de
todo, los resultados agregados no revelan los valores de los datos personales.
Pero considere un caso en el que varios análisis de los datos dan como resultado
agregaciones declaradas que, al combinarse, podrían usarse para trabajar con
información sobre los usuarios del conjunto de datos de origen. Suponga que 10
participantes comparten datos sobre su ubicación y salario, y que se crean dos
informes a partir de dichos datos:
En este módulo, analizará la privacidad diferencial, una técnica que puede ayudar a
proteger los datos personales contra este tipo de exposición.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
A medida que el aprendizaje automático se hace cada vez más importante para las
decisiones que afectan a la salud, la seguridad, el bienestar económico y otros
aspectos de la vida de las personas, es importante comprender cómo realizan las
predicciones los modelos y poder explicar la lógica de las decisiones basadas en el
aprendizaje automático.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Importancia de característica
Los explicadores de los modelos usan técnicas estadísticas para calcular la
importancia de las características. Esto le permite cuantificar la influencia relativa
que tiene cada característica del conjunto de datos de entrenamiento en la
predicción de la etiqueta. Los explicadores evalúan un conjunto de datos de prueba
de casos de características y las etiquetas que el modelo les predice.
ingresos: 0,98
edad: 0,54
Por ejemplo, supongamos que Sam pide un préstamo, que el modelo de Machine
Learning aprueba (prediciendo que Sam va a amortizarlo). Puede usar un explicador
a fin de calcular la importancia de la característica local para que la aplicación de
Sam determine qué factores han influido en la predicción. Puede ser que obtenga un
resultado como este:
Para un modelo de regresión, no hay ninguna clase, por lo que los valores de
importancia local simplemente indican el nivel de influencia que cada característica
tiene en la etiqueta escalar de predicción.
Uso de explicadores
Puede usar el SDK de Azure Machine Learning para crear explicadores de modelos,
aunque no se hayan entrenado con un experimento de Azure Machine Learning.
Creación de un explicador
Para interpretar un modelo local, debe instalar el paquete azureml-interpret y usarlo
para crear un explicador. Hay muchos tipos de explicador, entre ellos:
En el ejemplo de código siguiente se muestra cómo crear una instancia de cada uno
de estos tipos de explicador para un modelo hipotético denominado
modelo_préstamo:
Python
Copiar
# MimicExplainer
mim_explainer = MimicExplainer(model=loan_model,
initialization_examples=X_test,
explainable_model =
DecisionTreeExplainableModel,
features=['loan_amount','income','age','marital_status'],
classes=['reject', 'approve'])
# TabularExplainer
initialization_examples=X_test,
features=['loan_amount','income','age','marital_status'],
classes=['reject', 'approve'])
# PFIExplainer
features=['loan_amount','income','age','marital_status'],
classes=['reject', 'approve'])
Python
Copiar
# MimicExplainer
global_mim_explanation = mim_explainer.explain_global(X_train)
global_mim_feature_importance =
global_mim_explanation.get_feature_importance_dict()
# TabularExplainer
global_tab_explanation = tab_explainer.explain_global(X_train)
global_tab_feature_importance =
global_tab_explanation.get_feature_importance_dict()
# PFIExplainer
global_pfi_explanation = pfi_explainer.explain_global(X_train,
y_train)
global_pfi_feature_importance =
global_pfi_explanation.get_feature_importance_dict()
Nota
Python
Copiar
# MimicExplainer
local_mim_explanation = mim_explainer.explain_local(X_test[0:5])
local_mim_features =
local_mim_explanation.get_ranked_local_names()
local_mim_importance =
local_mim_explanation.get_ranked_local_values()
# TabularExplainer
local_tab_explanation = tab_explainer.explain_local(X_test[0:5])
local_tab_features =
local_tab_explanation.get_ranked_local_names()
local_tab_importance =
local_tab_explanation.get_ranked_local_values()
Nota
Creación de explicaciones
Cuando se usa un estimador o un script para entrenar un modelo en un experimento
de Azure Machine Learning, puede crear un explicador y cargar la explicación que
genera en la ejecución para su posterior análisis.
Python
Copiar
from azureml.contrib.interpret.explanation.explanation_client
import ExplanationClient
run = Run.get_context()
# Get explanation
explanation = explainer.explain_global(X_test)
explain_client = ExplanationClient.from_run(run)
explain_client.upload_model_explanation(explanation,
comment='Tabular Explanation')
run.complete()
Visualización de la explicación
Puede ver la explicación que ha creado para el modelo en la pestaña Explicaciones
para la ejecución en Azure Machine Learning Studio.
Python
Copiar
from azureml.contrib.interpret.explanation.explanation_client
import ExplanationClient
client = ExplanationClient.from_run_id(workspace=ws,
experiment_name=experiment.experiment_name,
run_id=run.id)
explanation = client.download_model_explanation()
feature_importances = explanation.get_feature_importance_dict()
Visualización de explicaciones
Las explicaciones del modelo en el Estudio de Azure Machine Learning incluyen
varias visualizaciones que puede usar para explorar la importancia de las
características.
Nota
Puede usar el control deslizante para mostrar solo las N principales características.
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
Los modelos de Machine Learning se utilizan cada vez más para fundamentar
decisiones que afectan a la vida de las personas. Por ejemplo, una predicción
realizada por un modelo de Machine Learning podría influir en lo siguiente:
Con estas decisiones tan importantes en el aire, se debe confiar en que los modelos
de Machine Learning predigan y no discriminen subconjuntos de la población por
factores étnicos, de género, de edad, etc.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
● Age
● Situación laboral
● Income
● Cuenta de ahorro
● Deuda actual
A primera vista, esta comparación parece confirmar que hay un sesgo en el modelo
que discrimina a los solicitantes más jóvenes. Pero si se considera la población en
su conjunto, es posible que las personas más jóvenes generalmente dispongan de
menos ingresos que otras con profesiones más establecidas, que tengan niveles
inferiores de ahorro y recursos, y una mayor proporción de incumplimiento de las
condiciones del préstamo.
Imagine que la coincidencia de los casos de validación en los que el solicitante tiene
25 años o menos es 0,50 y 0,83 para los casos en los que el solicitante es mayor de
25 años. Es decir, el modelo ha identificado correctamente el 50 % de las personas
del grupo de edad de 25 años o menos que han devuelto un préstamo (y, por tanto,
ha clasificado incorrectamente al otro 50 % como impagos del préstamo), pero ha
detectado al 83 % de los que han pagado en el grupo de mayor edad (solo se
clasifica de forma incorrecta el 17 %). La disparidad en el rendimiento de la
predicción entre los grupos es del 33 %; el modelo predice significativamente más
falsos negativos para el grupo de edad más joven.
Posibles causas de la disparidad
Cuando encuentre una disparidad en las proporciones de predicción o las métricas
de rendimiento de predicción en grupos de características confidenciales, merece la
pena evaluar las causas posibles. Entre ellas se incluyen:
Para funcionar, calcula métricas de grupo para las características confidenciales que
especifique. Las propias métricas se basan en métricas estándar de evaluación de
modelos de Scikit-learn, como la precisión o la coincidencia para los modelos de
clasificación.
100 XP
25 minutos
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Requisitos previos
● Conocimientos de Python
● Experiencia en el entrenamiento y la implementación de modelos con el
SDK de Azure Machine Learning
Introducción
Application Insights es un servicio de administración del rendimiento de las
aplicaciones de Microsoft Azure que permite capturar, almacenar y analizar los
datos de telemetría de las aplicaciones.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Python
Copiar
ws = Workspace.from_config()
ws.get_details()['applicationInsights']
Habilitar Application Insights para un servicio
Al implementar un nuevo servicio en tiempo real, puede habilitar Application Insights
en la configuración de implementación para el servicio, como se muestra en este
ejemplo:
Python
Copiar
dep_config = AciWebservice.deploy_configuration(cpu_cores = 1,
memory_gb = 1,
enable_app_insights=True)
Python
Copiar
service = ws.webservices['my-svc']
service.update(enable_app_insights=True)
Python
Copiar
def init():
global model
model = joblib.load(Model.get_model_path('my_model'))
def run(raw_data):
data = json.loads(raw_data)['data']
predictions = model.predict(data)
print(log_txt)
return predictions.tolist()
Copiar
traces
timestamp customDimensions_Content
100 XP
30 minutos
Instrucciones
Siga estas instrucciones para completar el ejercicio.
1. Si todavía no tiene una suscripción de Azure, suscríbase para disfrutar
de una prueba gratuita en https://azure.microsoft.com.
2. Vea el repositorio de ejercicios en https://aka.ms/mslearn-dp100.
3. Si todavía no lo ha hecho, complete el ejercicio Creación de un área de
trabajo de Azure Machine Learning para aprovisionar un área de trabajo
de Azure Machine Learning, crear una instancia de proceso y clonar los
archivos necesarios.
4. Realice el ejercicio Supervisar un modelo.
Supervisión del desfase de datos con
Azure Machine Learning
Cambiar las tendencias de los datos a lo largo del tiempo puede reducir la precisión
de las predicciones realizadas por un modelo. Supervisar este desfase de datos es
una forma importante de asegurarse de que el modelo sigue haciendo predicciones
de forma precisa.
Objetivos de aprendizaje
Obtenga información sobre cómo supervisar el desfase de datos en Azure Machine
Learning.
Introducción
Normalmente los modelos de Machine Learning se entrenan con un conjunto de
datos histórico que es representativo de los nuevos datos que el modelo recibirá
para hacer inferencias. Pero con el tiempo puede haber tendencias que cambien el
perfil de los datos, lo que hará que el modelo sea menos preciso.
Por ejemplo, supongamos que un modelo está entrenado para predecir la previsión
de consumo de combustible por kilómetro de un vehículo en función de su
cilindrada, tamaño, peso y otras características. Con el tiempo, a medida que las
tecnologías de fabricación y motorización de los automóviles progresan, puede ser
que la autonomía habitual de los vehículos mejore drásticamente, con lo que las
predicciones realizadas por el modelo entrenado con datos más antiguos pueden
ser menos precisas.
Este cambio en los perfiles de datos entre el entrenamiento y la inferencia se
denomina desfase de datos y puede ser un problema importante para los modelos
predictivos que se usan en producción. Por lo tanto, es importante poder supervisar
el desfase de datos a lo largo del tiempo y volver a entrenar los modelos si es
necesario para mantener la precisión de las predicciones.
Objetivos de aprendizaje
En este módulo, aprenderá a lo siguiente:
Nota
Python
Copiar
monitor = DataDriftDetector.create_from_datasets(workspace=ws,
name='dataset-drift-detector',
baseline_data_set=train_ds,
target_data_set=new_data_ds,
compute_target='aml-cluster',
frequency='Week',
feature_list=['age','height', 'bmi'],
latency=24)
Después de crear el monitor del conjunto de datos, puede hacer una reposición para
comparar al instante el conjunto de datos de la base de referencia con los datos
existentes en el conjunto de datos de destino, como se muestra en el ejemplo
siguiente, en el que se repone el monitor en función de los cambios semanales para
las seis semanas anteriores:
Python
Copiar
import datetime as dt
Programación de alertas
Al definir un monitor de datos, se especifica la programación en la que se debe
ejecutar. Además, puede especificar un umbral para la tasa de desfase y una
dirección de correo electrónico de un superior al que enviar las notificaciones si se
supera este umbral.
Python
Copiar
alert_email = AlertConfiguration('data_scientists@contoso.com')
monitor = DataDriftDetector.create_from_datasets(ws,
'dataset-drift-detector',
baseline_data_set, target_data_set,
compute_target=cpu_cluster,
frequency='Week',
latency=2,
drift_threshold=.3,
alert_configuration=alert_email)
Instrucciones
Siga estas instrucciones para completar el ejercicio.
Introducción
El aprendizaje automático requiere grandes cantidades de datos para entrenar
modelos eficaces. Algunos de estos datos pueden contener información confidencial
de individuos o empresas que deben protegerse para garantizar su privacidad. Los
desafíos de seguridad relacionados con el aprendizaje automático no solo se limitan
a los datos, y la configuración de la creación de un entorno de trabajo seguro puede
ser intimidatoria. Azure Machine Learning (Azure ML) proporciona varios
mecanismos que ofrecen un control pormenorizado del entorno de red, los recursos
que se usan en él y los datos a los que se accede. Establecer las medidas
adecuadas puede proteger tanto de los atacantes externos como de problemas
internos, como la negligencia o los procesos sin consolidar.
Requisitos previos
● Conocimientos básicos de Azure
Objetivos de aprendizaje
Objetivos de este módulo:
Roles de usuario
Los roles de Azure RBAC pueden asignarse a usuarios y grupos. Los derechos
asignados a cada grupo se distribuyen como un sistema basado en permisos, con el
acceso establecido y las restricciones claramente definidas. Este control se aplica
en el nivel de área de trabajo y solo pueden cambiarlo los administradores o los
propietarios del área de trabajo específica de Azure Machine Learning. Un área de
trabajo de Azure Machine Learning, al igual que otros recursos de Azure, incluye
tres roles predeterminados cuando se crea. Puede agregar usuarios al área de
trabajo y asignarles uno de estos roles:
Roles personalizados
Copiar
"Actions": [
"Microsoft.MachineLearningServices/workspaces/*/read",
"Microsoft.MachineLearningServices/workspaces/*/action",
"Microsoft.MachineLearningServices/workspaces/*/delete",
"Microsoft.MachineLearningServices/workspaces/*/write"
],
"NotActions": [
"Microsoft.MachineLearningServices/workspaces/delete",
"Microsoft.MachineLearningServices/workspaces/write",
"Microsoft.MachineLearningServices/workspaces/computes/*/write",
"Microsoft.MachineLearningServices/workspaces/computes/*/delete",
"Microsoft.Authorization/*",
"Microsoft.MachineLearningServices/workspaces/computes/listKeys/ac
tion",
"Microsoft.MachineLearningServices/workspaces/listKeys/action",
"Microsoft.MachineLearningServices/workspaces/services/aks/write",
"Microsoft.MachineLearningServices/workspaces/services/aks/delete"
,
"Microsoft.MachineLearningServices/workspaces/endpoints/pipelines/
write"
],
"AssignableScopes": [
"/subscriptions/<subscription_id>/resourceGroups/<resource_group_n
ame>/providers/Microsoft.MachineLearningServices/workspaces/<works
pace_name>"
Tenga en cuenta las secciones Actions y NotActions a continuación que definen los
permisos para el rol personalizado y el ámbito asignado que se encuentra en el nivel
de área de trabajo específico. En este ejemplo, las acciones del científico de datos
se definen mediante un carácter comodín (representado por el signo *) que extiende
un permiso a todo lo que coincida con la cadena de acción que proporcione. Por lo
tanto, en el ejemplo anterior, la cadena del carácter comodín agrega todos los
permisos relacionados con la lectura, escritura, acción o eliminación dentro del área
de trabajo.
Sistema
Una dificultad común para los desarrolladores es la administración de los secretos y
las credenciales usados para proteger la comunicación entre los distintos
componentes. Azure Machine Learning se basa en Azure Active Directory (Azure
AD) para la autenticación o la comunicación entre otros recursos en la nube de
Azure. Azure AD es un servicio de identidad basada en la nube y de administración
de acceso que ayuda a los empleados de una organización a iniciar sesión y
acceder a los recursos en la nube de Azure.
Sesión de la CLI de Azure: se usa una sesión activa de la CLI de Azure para
autenticarse. La autenticación con la CLI de Azure se usa durante la
experimentación y el desarrollo iterativo, o cuando se necesita un proceso
automatizado para autenticarse en el servicio mediante una sesión autenticada
previamente. Puede iniciar sesión en Azure mediante la CLI de Azure en la estación
de trabajo local, sin almacenar las credenciales en el código ni pedir al usuario que
se autentique.
Identidades administradas
Una vez que tenga una identidad administrada, puede solicitar tokens mediante un
punto de conexión de token en un recurso como una máquina virtual. Estos tokens
funcionan con la autorización existente de los usuarios de Azure RBAC para
permitirles realizar acciones, como extraer claves de Azure Key Vault o cualquier
otro secreto. Del mismo modo, supongamos que el usuario tiene un rol de Azure
RBAC que permite el uso de una solución de almacenamiento de Azure. En ese
caso, ese token se puede usar para autenticar y leer o insertar datos en el
almacenamiento sin credenciales en su código. Las operaciones sobre identidades
administradas se pueden realizar mediante una plantilla de Azure Resource
Manager (ARM), Azure Portal, la CLI de Azure, PowerShell y las API REST.
Durante la creación del clúster de proceso o la edición de los detalles del clúster de
proceso, en Configuración avanzada, cambie a Assign a managed identity (Asignar
una identidad administrada) y especifique una identidad asignada por el sistema o
una identidad asignada por el usuario. Tenga en cuenta que los clústeres de
proceso de Azure Machine Learning solo admiten una identidad asignada por el
sistema o varias identidades asignadas por el usuario, no ambas de forma
simultánea.
Nota
Las identidades administradas solo se pueden usar con Azure Machine Learning
cuando se usa el SDK de Azure Machine Learning en una máquina virtual de Azure
o un clúster de proceso de Azure Machine Learning. Este flujo de trabajo permite
que la máquina virtual se conecte al área de trabajo mediante la identidad
administrada en lugar de la cuenta de Azure AD del usuario individual, y sin
almacenar las credenciales en el código.
Requisitos previos
● Una cuenta y una suscripción de Azure
Si aún no tiene una suscripción de Azure, siga las instrucciones del vínculo
siguiente:
Importante
utilizados por el área de trabajo, así como datos para los experimentos
y el entrenamiento de modelos.
● Una instancia de Azure Key Vault, que se usa para administrar secretos
área de trabajo.
● Un registro de contenedor, creado a medida para administrar
Variable Value
resource_group_name AI-Resource
workspace_name ml-workspace
2. Copiar
"IsCustom": true,
"Actions": ["*"],
"NotActions": [
"Microsoft.MachineLearningServices/workspaces/*/delete",
"Microsoft.MachineLearningServices/workspaces/write",
"Microsoft.MachineLearningServices/workspaces/computes/*/write
",
"Microsoft.MachineLearningServices/workspaces/computes/*/delet
e",
"Microsoft.Authorization/*/write"
],
"AssignableScopes": [
"/subscriptions/<subscription_id>/resourceGroups/<resource_gro
up_name>/providers/Microsoft.MachineLearningServices/workspace
s/<workspace_name>"
3.
4. Cargue el archivo de definición de roles:
● Haga clic en el icono Cargar/Descargar archivos.
● Haga clic en Cargar.
● Seleccione el archivo data_scientist_custom_role.json que
creó anteriormente:
5.
6. Cree una definición de rol con el comando de CLI az role definition
create (observe que el último argumento es el archivo que acaba de
cargar):
7. Copiar
8.
Esto agrega el rol "Científico de datos personalizado", que se limita a ejecutar
experimentos en ml-workspace.
Resumen
¡Enhorabuena!
Bash
Copiar
export KEY_VAULT_NAME=<your-unique-keyvault-name>
Esta contraseña se almacena de forma segura y está cifrada. Por ejemplo, una
aplicación de Python que use el SDK de Azure Machine Learning puede acceder a
esta clave como se muestra a continuación:
Python
Copiar
'''
Simple example of obtaining a secret from the keyvault.
pip installed
'''
import os
keyVaultName = os.environ["KEY_VAULT_NAME"]
credential = DefaultAzureCredential()
client = SecretClient(vault_url=
f"https://{keyVaultName}.vault.azure.net", credential=credential)
retrieved_secret = client.get_secret("ExamplePassword")
Bash
Copiar
La información anterior proporciona una solución genérica para usar Key Vault.
Normalmente, con Azure Machine Learning, ejecutará código mediante una
ejecución remota.
Python
Copiar
run = Run.get_context()
Las VNet permiten que los recursos, como las máquinas virtuales (VM) y las áreas
de trabajo de ML, se comuniquen de forma segura entre sí y con otras redes o con
Internet.
En este ejercicio solo se ofrece una descripción básica del proceso que se lleva a
cabo para realizar la protección de un entorno de red del área de trabajo de ML.
Para obtener el proceso completo paso a paso de un entorno de producción, siga el
vínculo al final de este ejercicio.
Advertencia
Este ejercicio bloqueará el acceso al área de trabajo afectada y no se debe realizar
en un área de trabajo de producción.
Requisitos previos
● Conocimientos básicos sobre conceptos de redes.
● Una cuenta y una suscripción de Azure.
● Un grupo de recursos del área de trabajo de Azure Machine Learning
como se creó en el ejercicio anterior.
Importante
Para simplificar, estamos creando una sola subred para la red virtual. Una subred es
un intervalo de direcciones IP en la red virtual. Podríamos dividir una red virtual en
varias subredes para la organización y la seguridad, por ejemplo, una subred de
entrenamiento que solo los científicos de datos podrían usar y una subred de
inferencia que esté disponible públicamente.
Podemos usar Estudio de Azure Machine Learning para acceder a los contenidos
del área de trabajo.
Sugerencia
Estudio de Azure Machine Learning es un portal web con herramientas de alto nivel
para el entrenamiento de modelos, la implementación y la administración de
recursos.
Ahora tenemos que conectar ambos para que el tráfico de red del área de trabajo
tenga que pasar por nuestra VNet. Es decir, queremos que nuestro área de trabajo
esté disponible solo para los recursos que están conectados a la red virtual MLVNet.
Un punto de conexión privado es una interfaz de red que usa una dirección IP
privada de la VNet para crear conexiones seguras y privadas a un recurso.
Tenga en cuenta que, de la misma manera que no puede acceder a ella, tampoco
pueden acceder otros recursos de la organización que no forman parte de la subred.
Abrir el acceso para que los recursos puedan conectarse requiere un planeamiento
estratégico.
Resumen
Completado
100 XP
2 minutos