I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercício 2: Encontrando ímpares em uma lista
Implemente a função encontra_impares(lista), que recebe como parâmetro uma lista de números inteiros e devolve uma outra lista apenas com os números ímpares da lista dada.
Sua solução deve ser implementada utilizando recursão.
Dica: você vai precisar do método extend() que as listas possuem.
Can you write Python code for it?

def encontra_impares_tradicional_way(lista):

    lista_impares = []

    for i in lista:
        if i % 2 != 0: # é impar!
            lista_impares.append(i)

    return lista_impares

a = [5, 66, 77, 99, 102, 239, 567, 875, 934]
encontra_impares_tradicional_way(a)

b = [2, 5, 34, 66, 100, 102, 999]
encontra_impares_tradicional_way(b)

stack = ['a','b']
stack.extend(['g','h'])
stack

def encontra_impares(lista):

    if len(lista) == 0:
        return []
    if lista[0] % 2 != 0: # se o elemento é impar
        return [lista[0]] + encontra_impares(lista[1:])
    else:
        return encontra_impares(lista[1:])

a = [5, 66, 77, 99, 102, 239, 567, 875, 934]
encontra_impares(a)

encontra_impares([5])

encontra_impares([1, 2, 3])

encontra_impares([2, 4, 6, 8])

encontra_impares([9])

encontra_impares([4, 11])

encontra_impares([2, 10, 20, 7, 30, 12, 6, 6])

encontra_impares([])

encontra_impares([4, 331, 1001, 4])


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercício 2: Fatorial
Implemente a função fatorial(x), que recebe como parâmetro um número inteiro e devolve um número inteiro correspondente ao fatorial de x.
Sua solução deve ser implementada utilizando recursão.
Can you write Python code for it?

def fatorial(x):

    if x == 0 or x == 1:
        return 1
    else:
        return x * fatorial(x - 1)

fatorial(4)

fatorial(5)

fatorial(3)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercício 2: Matrizes multiplicáveis
Duas matrizes são multiplicáveis se o número de colunas da primeira é igual ao número de linhas da segunda. Escreva a função sao_multiplicaveis(m1, m2) que recebe duas matrizes como parâmetro e devolve True se as matrizes forem multiplicavéis (na ordem dada) e False caso contrário.
Exemplos:
m1 = [[1, 2, 3], [4, 5, 6]]
m2 = [[2, 3, 4], [5, 6, 7]]
sao_multiplicaveis(m1, m2) => False
m1 = [[1], [2], [3]]
m2 = [[1, 2, 3]]
sao_multiplicaveis(m1, m2) => True
Can you write Python code for it?

def sao_multiplicaveis(m1, m2):

    '''Recebe duas matrizes como parâmetros e devolve True se as matrizes forem multiplicáveis (número de colunas
    da primeira é igual ao número de linhs da segunda). False se não forem
    '''

    if len(m1) == len(m2[0]):
        return True
    else:
        return False

m1 = [[1, 2, 3], [4, 5, 6]]
m2 = [[2, 3, 4], [5, 6, 7]]
sao_multiplicaveis(m1, m2)

m1 = [[1], [2], [3]]
m2 = [[1, 2, 3]]
sao_multiplicaveis(m1, m2)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercício 2: Ordenação com bubble sort
Implemente a função bubble_sort(lista), que recebe uma lista com números inteiros como parâmetro e devolve esta lista ordenada. Utilize o algoritmo bubble sort.
Além de devolver uma lista ordenada, sua função deve imprimir os resultados parciais da ordenação ao fim de cada iteração do algoritmo ao longo da lista. Observe que, como a última iteração do algoritmo apenas verifica que a lista está ordenada, o último resultado deve ser impresso duas vezes. Portanto, se seu algoritmo precisa de duas passagens para ordenar a lista, e uma terceira para verificar que a lista está ordenada, 3 resultados parciais devem ser impressos.
bubble_sort([5, 1, 4, 2, 8])
[1, 4, 2, 5, 8]
[1, 2, 4, 5, 8]
[1, 2, 4, 5, 8]
deve devolver [1, 2, 4, 5, 8]
Can you write Python code for it?


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercício 2: Triângulos semelhantes
Ainda na classe Triangulo, escreva um método semelhantes(triangulo)
que recebe um objeto do tipo Triangulo como parâmetro e verifica
se o triângulo atual é semelhante ao triângulo passado como parâmetro.
Caso positivo, o método deve devolver True. Caso negativo,
deve devolver False.
Verifique a semelhança dos triângulos através do comprimento
dos lados.
Dica: você pode colocar os lados de cada um dos triângulos em uma
lista diferente e ordená-las.
Exemplo:
t1 = Triangulo(2, 2, 2)
t2 = Triangulo(4, 4, 4)
t1.semelhantes(t2)
deve devolver True
'''
Can you write Python code for it?

class Triangulo:

    '''
    O resultado dos testes com seu programa foi:

    ***** [0.2 pontos]: Testando método semelhantes(Triangulo(3, 4, 5)) para Triangulo(3, 4, 5) - Falhou *****
    TypeError: 'Triangulo' object is not iterable

    ***** [0.2 pontos]: Testando método semelhantes(Triangulo(3, 4, 5)) para Triangulo(6, 8, 10) - Falhou *****
    TypeError: 'Triangulo' object is not iterable

    ***** [0.2 pontos]: Testando método semelhantes(Triangulo(6, 8, 10)) para Triangulo(3, 4, 5) - Falhou *****
    TypeError: 'Triangulo' object is not iterable

    ***** [0.4 pontos]: Testando método semelhantes(Triangulo(3, 3, 3)) para Triangulo(3, 4, 5) - Falhou *****
    TypeError: 'Triangulo' object is not iterable

    '''
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

# https://stackoverflow.com/questions/961048/get-class-that-defined-method
    def semelhantes(self, Triangulo):

        list1 = []

        for arg in self:
            list1.append(arg)

        list2 = []

        for arg in self1:
            list2.append(arg)

        for i in list2:
            print(i)

t1 = Triangulo(2, 2, 2)
t2 = Triangulo(4, 4, 4)
t1.semelhantes(t2)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercícios

Escreva uma versão do TestaBhaskara usando @pytest.mark.parametrize

Escreva uma bateria de testes para o seu código preferido

Tarefa de programação: Lista de exercícios - 3
Exercício 1: Uma classe para triângulos
Defina a classe Triangulo cujo construtor recebe 3 valores inteiros correspondentes aos lados a, b e c de um triângulo.
A classe triângulo também deve possuir um método perimetro, que não recebe parâmetros e devolve um valor inteiro correspondente ao perímetro do triângulo.
t = Triangulo(1, 1, 1)
deve atribuir uma referência para um triângulo de lados 1, 1 e 1 à variável t
Um objeto desta classe deve responder às seguintes chamadas:
t.a
deve devolver o valor do lado a do triângulo
t. b
deve devolver o valor do lado b do triângulo
t.c
deve devolver o valor do lado c do triângulo
t.perimetro()
deve devolver um inteiro correspondente ao valor do perímetro do triângulo.
Can you write Python code for it?

class Triangulo:

    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def perimetro(self):
        return self.a + self.b + self.c

t = Triangulo(1, 1, 1)

t.a

t.b

t.c

t.perimetro()


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Exercícios adicionais
Exercício 1: Contando vogais ou consoantes
Escreva a função conta_letras(frase, contar="vogais"), que recebe como primeiro parâmetro uma string contendo uma frase e como segundo parâmetro uma outra string. Este segundo parâmetro deve ser opcional.
Quando o segundo parâmetro for definido como "vogais", a função deve devolver o numero de vogais presentes na frase. Quando ele for definido como "consoantes", a função deve devolver o número de consoantes presentes na frase. Se este parâmetro não for passado para a função, deve-se assumir o valor "vogais" para o parâmetro.
Exemplos:
conta_letras('programamos em python')
6
conta_letras('programamos em python', 'vogais')
6
conta_letras('programamos em python', 'consoantes')
13
Can you write Python code for it?

def conta_letras(frase, contar = 'vogais'):

    pos = len(frase) - 1 # atribui na variável pos (posição) a posição do array
    count = 0 # define o contador de vogais

    while pos >= 0: # conta as vogais
        if frase[pos] == 'a' or frase[pos] == 'e' or frase[pos] == 'i' or frase[pos] == 'o' or frase[pos] == 'u':
            count += 1
        pos = pos - 1

    if contar == 'consoantes':
        frase = frase.replace(' ', '')     # retira espaços em branco
        return len(frase) - count # subtrai do total as vogais
    else:
        return count

conta_letras('programamos em python')

conta_letras('programamos em python', 'vogais')

conta_letras('programamos em python', 'consoantes')

conta_letras('bcdfghjklmnpqrstvxywz', 'consoantes')

len('programamos em python')

frase = 'programamos em python'
frase.replace(' ', '')
frase


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Fixture: valor fixo para um conjunto de testes
@pytest.fixture
Can you write Python code for it?

# Nos estudos ficou pytest_bhaskara.py

import Bhaskara
import pytest

class TestBhaskara:

    @pytest.fixture
    def b(self):
        return Bhaskara.Bhaskara()

    def testa_uma_raiz(self, b):
        assert b.calcula_raizes(1, 0, 0) == (1, 0)

    def testa_duas_raizes(self, b):
        assert b.calcula_raizes(1, -5, 6) == (2, 3, 2)

    def testa_zero_raizes(self, b):
        assert b.calcula_raizes(10, 10, 10) == 0

    def testa_raiz_negativa(self, b):
        assert b.calcula_raizes(10, 20, 10) == (1, -1)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Incluindo
print(__name__)
 na última linha de fibo.py, ao fazer a importação import fibo no shell do Python, imprime 'fibo', que é o nome do programa.
Ao incluir

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

podemos ver se está sendo executado como script (com o if do jeito que está) ou como módulo dentro de outro código (se o nome não for main, está sendo importado pra usar alguma função lá dentro).
Can you write Python code for it?

def fazAlgo(string): # inverte a string e deixa as vogais maiúsculas
    pos = len(string)-1 # define a variável posição do array
    stringMi = string.lower() # aqui estão todas minúsculas
    string = string.upper() # aqui estão todas maiúsculas
    stringRe = "" # string de retorno

    while pos >= 0:
        if string[pos] == 'A' or string[pos] == 'E' or string[pos] == 'I' or string[pos] == 'O' or string[pos] == 'U':
            stringRe = stringRe + string[pos]
        else:
            stringRe = stringRe + stringMi[pos]
        pos = pos - 1
    return stringRe

if __name__ == "__main__":
    print(fazAlgo("teste"))
    print(fazAlgo("o ovo do avestruz"))
    print(fazAlgo("A CASA MUITO ENGRAÇADA"))
    print(fazAlgo("A TELEvisão queBROU"))
    print(fazAlgo("A Vaca Amarela"))


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Melhoria no Algoritmo de Ordenação da Bolha
Percorre a lista múltiplas vezes; a cada passagem, compara todos os elementos adjacentes e troca de lugar os que estiverem fora de ordem.
Melhoria: se em uma das iterações, nenhuma troca é realizada, isso significa que a lista já está ordenada e podemos finalizar o algoritmo.
Can you write Python code for it?

class Ordenador:

    def selecao_direta(self, lista):

        fim = len(lista)

        for i in range(fim - 1):
            # Inicialmente o menor elemento já visto é o i-ésimo
            posicao_do_minimo = i

            for j in range(i + 1, fim):
                if lista[j] < lista[posicao_do_minimo]: # encontrou um elemento menor...
                    posicao_do_minimo = j               # ...substitui.

            # Coloca o menor elemento encontrado no início da sub-lista
            # Para isso, troca de lugar os elementos nas posições i e posicao_do_minimo

            lista[i], lista[posicao_do_minimo] = lista[posicao_do_minimo], lista[i]

    def bolha(self, lista):

        fim = len(lista)

        for i in range(fim - 1, 0, -1):
            for j in range(i):
                if lista[j] > lista[j + 1]:
                    lista[j], lista[j + 1] = lista[j + 1], lista[j]

    def bolha_curta(self, lista):

        fim = len(lista)

        for i in range(fim - 1, 0, -1):
            trocou = False
            for j in range(i):
                if lista[j] > lista[j + 1]:
                    lista[j], lista[j + 1] = lista[j + 1], lista[j]
                    trocou = True
            if not trocou: # que é igual a if trocou == False
                return

import random
import time

class ContaTempos:

    def lista_aleatoria(self, n): # n = número de elementos da lista
        from random import randrange
        lista = [random.randrange(1000) for x in range(n)] # lista com n elementos, todos sendo aleatórios de 0 a 999
        return lista

    def lista_quase_ordenada(self, n):
        lista = [x for x in range(n)] # lista ordenada
        lista[n//10] = -500 # localizou o -500 no primeiro décimo da lista
        return lista

    def compara(self, n):

        lista1 = self.lista_aleatoria(n)
        lista2 = lista1
        lista3 = lista2

   ...


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
POO
Can you write Python code for it?

class Carro:
    pass

meu_carro = Carro()
meu_carro

carro_do_trabalho = Carro()
carro_do_trabalho

meu_carro.ano = 1968
meu_carro.modelo = 'Fusca'
meu_carro.cor = 'azul'

meu_carro.ano

meu_carro.cor

carro_do_trabalho.ano = 1981
carro_do_trabalho.modelo = 'Brasília'
carro_do_trabalho.cor = 'amarela'

carro_do_trabalho.ano

novo_fusca = meu_carro # duas variáveis apontando para o mesmo objeto

novo_fusca #repare que é o mesmo end. de memória

novo_fusca.ano += 10

novo_fusca.ano

novo_fusca


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
POO – Programação Orientada a Objetos – Parte 2
Can you write Python code for it?

def main():
    carro1 = Carro('Brasília', 1968, 'amarela', 80)
    carro2 = Carro('Fuscão', 1981, 'preto', 95)

    carro1.acelere(40)
    carro2.acelere(50)
    carro1.acelere(80)
    carro1.pare()
    carro2.acelere(100)

class Carro:

    def __init__(self, modelo, ano, cor, vel_max):
        self.modelo = modelo
        self.ano    = ano
        self.cor    = cor
        self.vel    = 0
        self.maxV   = vel_max # velocidade máxima

    def imprima(self):
        if self.vel == 0: # parado dá para ver o ano
            print('%s %s %d' % (self.modelo, self.cor, self.ano))
        elif self.vel < self.maxV:
            print('%s %s indo a %d km/h' % (self.modelo, self.cor, self.vel))
        else:
            print('%s %s indo muito rapido!' % (self.modelo, self.cor))

    def acelere(self, velocidade):
        self.vel = velocidade
        if self.vel > self.maxV:
            self.vel = self.maxV
        self.imprima()

    def pare(self):
        self.vel = 0
        self.imprima()

main()


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Parametrização
Can you write Python code for it?

def fatorial(n):
    if n < 0:
        return 0
    i = fat = 1
    while i <= n:
        fat = fat * i
        i += 1
    return fat

import pytest

@pytest.mark.parametrize("entrada, esperado", [
    (0, 1),
    (1, 1),
    (-10, 0),
    (4, 24),
    (5, 120)
    ])

def testa_fatorial(entrada, esperado):
    assert fatorial(entrada) == esperado


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Praticar tarefa de programação: Exercício adicional (opcional)
Exercício 1: Ordenação com insertion sort
Implemente a função insertion_sort(lista), que recebe uma lista com números inteiros como parâmetro e devolve esta lista ordenada. Utilize o algoritmo insertion sort.
Can you write Python code for it?

def insertion_sort(lista):

    fim = len(lista)

    for i in range(fim - 1):
        posicao_do_minimo = i

        for j in range(i + 1, fim):
            if lista[j] < lista[posicao_do_minimo]:
                posicao_do_minimo = j
        lista[i], lista[posicao_do_minimo] = lista[posicao_do_minimo], lista[i]

    return lista


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Praticar tarefa de programação: Exercícios adicionais (opcionais)
Exercício 1: Fibonacci
Implemente a função fibonacci(n), que recebe como parâmetro um número inteiro e devolve um número inteiro correspondente ao n-ésimo elemento da sequência de Fibonacci. Sua solução deve ser implementada utilizando recursão.
Exemplo:
fibonacci(4)
deve devolver => 3
fibonacci(2)
deve devolver => 1
Can you write Python code for it?

def fib(n): # escreve a série de Fibonacci até n
    a, b = 0, 1
    while b < n:
        print(b, end = ' ')
        a, b = b, a + b
    print('\n\nO último termo é:', a)

fib(10)

def fib2(n):
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a + b
    return result

fib2(60)

## Example 2: Using recursion
def fibR(n):
   if n==1 or n==2:
      return 1
   return fibR(n-1)+fibR(n-2)

print (fibR(4))

def F(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return F(n-1)+F(n-2)

F(2)

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

fibonacci(4)

fibonacci(2)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Praticar tarefa de programação: Exercícios adicionais (opcionais)
Exercício 1: Gerando listas grandes
Escreva a função lista_grande(n), que recebe como parâmetro um número inteiro n e devolve uma lista contendo n números inteiros aleatórios.
Can you write Python code for it?

def lista_grande(n):

    import random
    return random.sample(range(1, 1000), n)

lista_grande(10)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Praticar tarefa de programação: Exercícios adicionais (opcionais)
Exercício 1: Imprimindo matrizes
Como proposto na primeira vídeo-aula da semana, escreva uma função imprime_matriz(matriz), que recebe uma matriz como parâmetro e imprime a matriz, linha por linha. Note que NÃO se deve imprimir espaços após o último elemento de cada linha!
Exemplos:
minha_matriz = [[1], [2], [3]]
imprime_matriz(minha_matriz)
1
2
3
minha_matriz = [[1, 2, 3], [4, 5, 6]]
imprime_matriz(minha_matriz)
1 2 3
4 5 6
Can you write Python code for it?

def imprime_matriz(A):

    for i in range(len(A)):
        for j in range(len(A[i])):
            print(A[i][j])

minha_matriz = [[1], [2], [3]]
imprime_matriz(minha_matriz)

minha_matriz = [[1, 2, 3], [4, 5, 6]]
imprime_matriz(minha_matriz)


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Semana 2
Can you write Python code for it?

"áurea gosta de coentro".capitalize()

"AQUI".capitalize()

# função para remover espaços em branco

"   email@company.com    ".strip()

"o abecedário da Xuxa é didático".count("a")

"o abecedário da Xuxa é didático".count("á")

"o abecedário da Xuxa é didático".count("X")

"o abecedário da Xuxa é didático".count("x")

"o abecedário da Xuxa é didático".count("z")

"A vida como ela seje".replace("seje", "é")

"áurea gosta de coentro".capitalize().center(80) #80 caracteres de largura, no centro apareça este texto

texto = "Ao que se percebe, só há o agora"
texto

texto.find("q")

texto.find('se')

texto[7] + texto[8]

texto.find('w')

fruta = 'amora'

fruta[:4] # desde o começo até a posição TRÊS!

fruta[1:] # desde a posição 1 (começa no zero) até o final

fruta[2:4] # desde a posição 2 até a posição 3


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Semana 3 - POO – Programação Orientada a Objetos
Can you write Python code for it?

def cria_matriz(tot_lin, tot_col, valor):

    matriz = []  #lista vazia

    for i in range(tot_lin):
        linha = []
        for j in range(tot_col):
            linha.append(valor)
        matriz.append(linha)

    return matriz

# import matriz # descomentar apenas no arquivo .py

def soma_matrizes(A, B):

    num_lin = len(A)
    num_col = len(A[0])

    C = cria_matriz(num_lin, num_col, 0) # matriz com zeros

    for lin in range(num_lin): # percorre as linhas da matriz
        for col in range(num_col): # percorre as colunas da matriz
            C[lin][col] = A[lin][col] + B[lin][col]

    return C

if __name__ == '__main__':
    A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    B = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
    print(soma_matrizes(A, B))

# No arquivo matriz.py

def cria_matriz(tot_lin, tot_col, valor):

    matriz = []  #lista vazia

    for i in range(tot_lin):
        linha = []
        for j in range(tot_col):
            linha.append(valor)
        matriz.append(linha)

    return matriz

# E no arquivo soma_matrizes.py

import matriz

def soma_matrizes(A, B):

    num_lin = len(A)
    num_col = len(A[0])

    C = matriz.cria_matriz(num_lin, num_col, 0) # matriz com zeros

    for lin in range(num_lin): # percorre as linhas da matriz
        for col in range(num_col): # percorre as colunas da matriz
            C[lin][col] = A[lin][col] + B[lin][col]

    return C

if __name__ == '__main__':
    A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    B = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
    print(soma_matrizes(A, B))

'''
Multiplicação de matrizes:

1 2 3      1 2     22 28
4 5 6   *  3 4  =  49 64
           5 6

1*1 + 2*3 + 3*5 = 22
1*2 + 2*4 + 3*6 = 28
4*1 + 5*3 + 6*5 = 49
4*2 + 5*4 + 6*6 = 64

c11 = a11*b11 + a12*b21 + c13*c31
c12 = a11*b21 + a12*b22 + c13*c23
c21 = a21*b11 + a22*b21 + c23*c31
c22 = a21*b21 + a22*b22 + c23*c23
'''

def multiplica_matrizes (A, B):

    num_linA, num_colA = len(A), len(A[0])
   ...


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Site com algoritmos de ordenação http://nicholasandre.com.br/sorting/
Testes automatizados dos algoritmos de ordenação
Can you write Python code for it?

class Ordenador:

    def selecao_direta(self, lista):

        fim = len(lista)

        for i in range(fim - 1):
            posicao_do_minimo = i

            for j in range(i + 1, fim):
                if lista[j] < lista[posicao_do_minimo]:
                    posicao_do_minimo = j
            lista[i], lista[posicao_do_minimo] = lista[posicao_do_minimo], lista[i]

    def bolha(self, lista):

        fim = len(lista)

        for i in range(fim - 1, 0, -1):
            for j in range(i):
                if lista[j] > lista[j + 1]:
                    lista[j], lista[j + 1] = lista[j + 1], lista[j]

    def bolha_curta(self, lista):

        fim = len(lista)

        for i in range(fim - 1, 0, -1):
            trocou = False
            for j in range(i):
                if lista[j] > lista[j + 1]:
                    lista[j], lista[j + 1] = lista[j + 1], lista[j]
                    trocou = True
            if not trocou:
                return

import random
import time

class ContaTempos:

    def lista_aleatoria(self, n):
        from random import randrange
        lista = [random.randrange(1000) for x in range(n)]
        return lista

    def lista_quase_ordenada(self, n):
        lista = [x for x in range(n)]
        lista[n//10] = -500
        return lista

import pytest

class TestaOrdenador:

    @pytest.fixture
    def o(self):
        return Ordenador()

    @pytest.fixture
    def l_quase(self):
        c = ContaTempos()
        return c.lista_quase_ordenada(100)

    @pytest.fixture
    def l_aleatoria(self):
        c = ContaTempos()
        return c.lista_aleatoria(100)

    def esta_ordenada(self, l):
        for i in range(len(l) - 1):
            if l[i] > l[i+1]:
                return False
        return True

    def test_bolha_curta_aleatoria(self, o, l_aleatoria):
        o.bolha_curta(l_aleatoria)
        assert...


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Tarefa de programação: Lista de exercícios - 4
Exercício 1: Lista ordenada
Escreva a função ordenada(lista), que recebe uma lista com números inteiros como parâmetro e devolve o booleano True se a lista estiver ordenada e False se a lista não estiver ordenada.
Can you write Python code for it?

def ordenada(list):

    flag = True

    for i in range(len(list) - 1):
        if list[i] > list[i + 1]:
            flag = False

    return flag


I am working on the file "Coursera/CICCP2/Curso Introdução à Ciência da Computação com Python - Parte 2.ipynb".
The first task is:
Testes para praticar
Can you write Python code for it?

class Pato:
  pass

pato = Pato()
patinho = Pato()
if pato == patinho:
  print("Estamos no mesmo endereço!")
else:
  print("Estamos em endereços diferentes!")

class Carro:
    def __init__(self, modelo, ano, cor): # init é o Construtor da classe
        self.modelo = modelo
        self.ano = ano
        self.cor = cor

carro_do_meu_avo = Carro('Ferrari', 1980, 'vermelha')
carro_do_meu_avo

carro_do_meu_avo.cor


I am working on the file "Coursera/IDSP/Introduction to DS in Python.ipynb".
The first task is:
^ Looks like Augusto de Campos' poems ^.^
Can you write Python code for it?

firstname = 'Christopher Arthur Hansen Brooks'.split(' ')[0] # [0] selects the first element of the list
lastname = 'Christopher Arthur Hansen Brooks'.split(' ')[-1] # [-1] selects the last element of the list
print(firstname)
print(lastname)

secondname = 'Christopher Arthur Hansen Brooks'.split(' ')[1]
secondname

thirdname = 'Christopher Arthur Hansen Brooks'.split(' ')[2]
thirdname

dict = {'Manuel' : 'manuel@company.com', 'Bill' : 'bill@ig.com'}
dict['Manuel']

for email in dict:
    print(dict[email])

for email in dict.values():
    print(email)

for name in dict.keys():
    print(name)

for name, email in dict.items():
    print(name)
    print(email)

sales_record = {
'price': 3.24,
'num_items': 4,
'person': 'Chris'}

sales_statement = '{} bought {} item(s) at a price of {} each for a total of {}'

print(sales_statement.format(sales_record['person'],
                             sales_record['num_items'],
                             sales_record['price'],
                             sales_record['num_items']*sales_record['price']))

import csv

%precision 2 # float point precision for printing to 2

with open('mpg.csv') as csvfile: #read the csv file
    mpg = list(csv.DictReader(csvfile)) # https://docs.python.org/2/library/csv.html
    # csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

mpg[:3] # The first three dictionaries in our list.

len(mpg) # list of 234 dictionaries

mpg[0].keys() # the names of the colums

# How to find the average cty fuel economy across all cars.
# All values in the dictionaries are strings, so we need to
# convert to float.
sum(float(d['cty']) for d in mpg) / len(mpg)

# Similarly this is how to find the average hwy fuel economy across
# all cars.
sum(float(d['hwy']) for d in mpg) / len(mpg)

# Use set to return the unique values for the number of cylinders
# the cars in our dataset have.

cylinders = set(d['cyl'] for d in mpg)
cylinders

# A set is an unordered collection of items. Every element is unique
#...


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
And this is a slice starting from the 3rd element of the string and going all the way to the end.
Can you write Python code for it?

x[3:]

firstname = 'Christopher'
lastname = 'Brooks'

print(firstname + ' ' + lastname)
print(firstname*3)
print('Chris' in firstname)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Assign function add_numbers to variable a.
Can you write Python code for it?

def add_numbers(x,y):
    return x+y

a = add_numbers
a(1,2)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Combining Arrays
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Convert the timestamp to datetime.
Can you write Python code for it?

dtnow = dt.datetime.fromtimestamp(tm.time())
dtnow


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Create an array using repeating list (or see np.tile)
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Creating Arrays
Create a list and convert it to a numpy array
Can you write Python code for it?

mylist = [1, 2, 3]
x = np.array(mylist)
x


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Dictionaries associate keys with values.
Can you write Python code for it?

x = {'Christopher Brooks': 'brooksch@umich.edu', 'Bill Gates': 'billg@microsoft.com'}
x['Christopher Brooks'] # Retrieve a value by using the indexing operator

x['Kevyn Collins-Thompson'] = None
x['Kevyn Collins-Thompson']


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Dot Product:
$ \begin{bmatrix}x_1 \ x_2 \ x_3\end{bmatrix}
\cdot
\begin{bmatrix}y_1 \ y_2 \ y_3\end{bmatrix}
= x_1 y_1 + x_2 y_2 + x_3 y_3$
Can you write Python code for it?

x.dot(y) # dot product  1*4 + 2*5 + 3*6

z = np.array([y, y**2])
print(len(z)) # number of rows of array


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Handy datetime attributes:
Can you write Python code for it?

dtnow.year, dtnow.month, dtnow.day, dtnow.hour, dtnow.minute, dtnow.second # get year, month, day, etc.from a datetime


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Here we are assigning all values in the array that are greater than 30 to the value of 30.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Here we are selecting all the rows up to (and not including) row 2, and all the columns up to (and not including) the last column.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Here's a more complex example where we are grouping the cars by number of cylinder, and finding the average cty mpg for each group.
Can you write Python code for it?

CtyMpgByCyl = []

for c in cylinders: # iterate over all the cylinder levels
    summpg = 0
    cyltypecount = 0
    for d in mpg: # iterate over all dictionaries
        if d['cyl'] == c: # if the cylinder level type matches,
            summpg += float(d['cty']) # add the cty mpg
            cyltypecount += 1 # increment the count
    CtyMpgByCyl.append((c, summpg / cyltypecount)) # append the tuple ('cylinder', 'avg mpg')

CtyMpgByCyl.sort(key=lambda x: x[0])
CtyMpgByCyl


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Here's an example of mapping the min function between two lists.
Can you write Python code for it?

store1 = [10.00, 11.00, 12.34, 2.34]
store2 = [9.00, 11.10, 12.34, 2.01]
cheapest = map(min, store1, store2)
expensivest = map(max, store1, store2)
cheapest # lazy evaluation


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Indexing / Slicing
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Iterate by row and index:
Can you write Python code for it?

for i, row in enumerate(test):
    print('row', i, 'is', row)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Iterate by row:
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Iterate over all of the keys:
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Let's look at a multidimensional array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Lists are a mutable data structure.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Make sure the number of values you are unpacking matches the number of variables being assigned.
Can you write Python code for it?

x = ('Christopher', 'Brooks', 'brooksch@umich.edu', 'Ann Arbor')
fname, lname, email = x


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Make sure you convert objects to strings before concatenating.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Now let's iterate through the map object to see the values.
Can you write Python code for it?

# Compara item por item na mesma posição!
# algo do tipo: if (store1[0] < store[2]: cheapest.append)()
for item in cheapest:
    print(item)

for item in expensivest:
    print(item)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Now the same thing but with list comprehension.
Can you write Python code for it?

my_list = [number for number in range(0,1000) if number % 2 == 0]
my_list


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Or just pass in a list directly
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Or using the indexing operator:
Can you write Python code for it?

i=0
while( i != len(x) ):
    print(x[i])
    i = i + 1


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Pass in a list of lists to create a multidimensional array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:

Reading and Writing CSV files

Let's import our datafile mpg.csv, which contains fuel economy data for 234 cars.

mpg : miles per gallon
class : car classification
cty : city mpg
cyl : # of cylinders
displ : engine displacement in liters
drv : f = front-wheel drive, r = rear wheel drive, 4 = 4wd
fl : fuel (e = ethanol E85, d = diesel, r = regular, p = premium, c = CNG)
hwy : highway mpg
manufacturer : automobile manufacturer
model : model of car
trans : type of transmission
year : model year
Can you write Python code for it?

import csv

%precision 2

with open('mpg.csv') as csvfile:
    mpg = list(csv.DictReader(csvfile))

mpg[:3] # The first three dictionaries in our list.


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Repeat elements of an array using repeat.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Similarly this is how to find the average hwy fuel economy across all cars.
Can you write Python code for it?

sum(float(d['hwy']) for d in mpg) / len(mpg)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
The Python Programming Language: Dates and Times
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
The Python Programming Language: More on Strings
Can you write Python code for it?

print('Chris' + 2)

print('Chris' + str(2))


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
The Python Programming Language: Numerical Python (NumPy)
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:

The Python Programming Language: Types and Sequences

Use type to return the object's type.
Can you write Python code for it?

type('This is a string')

type(None)

type(1)

type(1.0)

type(add_numbers)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
The number of rows has swapped with the number of columns.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
The shape of array z is (2,3) before transposing.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
This is a slice from the beginning of the string and stopping before the 3rd element.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
This is a slice of the last row, and only every other element.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
This is an example of how to loop through each item in the list.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
This is how to find the average cty fuel economy across all cars. All values in the dictionaries are strings, so we need to convert to float.
Can you write Python code for it?

sum(float(d['cty']) for d in mpg) / len(mpg)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
This will return the slice starting from the 4th element from the end and stopping before the 2nd element from the end.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
To avoid this, use r.copy to create a copy that will not affect the original array
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use * to repeat lists.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use + to concatenate lists.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use .T to get the transpose.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use .astype to cast to a specific type.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use .dtype to see the data type of the elements in the array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use : to indicate a range. array[start:stop]
Leaving start or stop empty will default to the beginning/end of the array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use append to append an object to a list.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use bracket notation to get the value at a specific index. Remember that indexing starts at 0.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use bracket notation to slice: array[row, column]
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use negatives to count from the back.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use set to return the unique values for the class types in our dataset.
Can you write Python code for it?

vehicleclass = set(d['class'] for d in mpg) # what are the class types
vehicleclass


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use set to return the unique values for the number of cylinders the cars in our dataset have.
Can you write Python code for it?

cylinders = set(d['cyl'] for d in mpg)
cylinders


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use the in operator to check if something is inside a list.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
Use vstack to stack arrays in sequence vertically (row wise).
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
We can also perform conditional indexing. Here we are selecting values from the array that are greater than 30. (Also see np.where)
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
You can unpack a sequence into different variables:
Can you write Python code for it?

x = ('Christopher', 'Brooks', 'brooksch@umich.edu')
fname, lname, email = x

fname

lname


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
add_numbers is a function that takes two numbers and adds them together.
Can you write Python code for it?

def add_numbers(x, y):
    return x + y

add_numbers(1, 2)


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
add_numbers updated to take an optional 3rd parameter. Using print allows printing of multiple expressions within a single cell.
Can you write Python code for it?

def add_numbers(x,y,z=None):
    if (z==None):
        return x+y
    else:
        return x+y+z

print(add_numbers(1, 2))
print(add_numbers(1, 2, 3))


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
add_numbers updated to take an optional flag parameter.
Can you write Python code for it?

def add_numbers(x, y, z=None, flag=False):
    if (flag):
        print('Flag is true!')
    if (z==None):
        return x + y
    else:
        return x + y + z

print(add_numbers(1, 2, flag=True))


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
argmax and argmin return the index of the maximum and minimum values in the array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
csv.Dictreader has read in each row of our csv file as a dictionary. len shows that our list is comprised of 234 dictionaries.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
date.today returns the current local date.
Can you write Python code for it?

today = dt.date.today()

today - delta # the date 100 days ago

today > today-delta # compare dates


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
diag extracts a diagonal or constructs a diagonal array.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
eye returns a 2-D array with ones on the diagonal and zeros elsewhere.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
ones returns a new array of given shape and type, filled with ones.
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
r has also been changed!
Can you write Python code for it?


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
reshape returns an array with the same data with a new shape.
Can you write Python code for it?

matriz = np.arange(0, 36)
matriz

matriz[::7]

matriz = np.arange(0, 36)
matriz

matriz[14:16]

matriz[20:22]

n = n.reshape(3, 5) # reshape array to be 3x5
n


I am working on the file "Coursera/IDSP/Week+1.ipynb".
The first task is:
<br>
zeros returns a new array of given shape and type, filled with zeros.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 1/Central-Limit-Theorem.ipynb".
The first task is:
For Triangular distribution with parameters a = 0, b = 1, c = 0.5 => mean = 0.5, variance = 1/24. So mean ~N(0.5, 1/(24 * n)), where n - number of experiments
Can you write Python code for it?

build_plot(n = 100, subsets_num = 1000)

build_plot(n = 500, subsets_num = 1000)

build_plot(n = 1000, subsets_num = 1000)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
[11]. С помощью метода minimize из scipy.optimize найдите минимум функции, определенной в п. 6, для значений параметра $w_0$ в диапазоне [-100,100] и $w_1$ - в диапазоне [-5, 5]. Начальная точка – ($w_0$, $w_1$) = (0, 0). Используйте метод оптимизации L-BFGS-B (аргумент method метода minimize). Проведите на графике из п. 5 Задания 1 прямую, соответствующую найденным оптимальным значениям параметров $w_0$ и $w_1$. Подпишите оси и график.
Can you write Python code for it?

def error(w):
    return np.sum(np.square((w[1] * data['Weight'] + w[0]) - data['Height']))

result = opt.minimize(error, [0, 0], method='L-BFGS-B')
result

plt.scatter(x=data['Weight'], y=data['Height'])
x_points = np.linspace(75, 175)
y1 = [func(result.x[0], result.x[1], x) for x in x_points]

plt.plot(x_points, y1, color='red')
plt.xlim((75, 175))
plt.ylim((55, 80))

plt.xlabel('Вес')
plt.ylabel('Рост')
plt.title('Зависимость роста от веса')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
[3]. Постройте картинку, на которой будут отображены попарные зависимости признаков , 'Height', 'Weight' и 'BMI' друг от друга. Используйте метод pairplot библиотеки Seaborn.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
[5]. Постройте scatter plot зависимости роста от веса, используя метод plot для Pandas DataFrame с аргументом kind='scatter'. Подпишите картинку.
Can you write Python code for it?

data.plot(x='Weight', y='Height', kind='scatter', title='Зависимость роста от веса')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Аргументы:

y='Height' - тот признак, распределение которого мы строим
kind='hist' - означает, что строится гистограмма
color='red' - цвет

[2]. Посмотрите на первые 5 записей с помощью метода head Pandas DataFrame. Нарисуйте гистограмму распределения веса с помощью метода plot Pandas DataFrame. Сделайте гистограмму зеленой, подпишите картинку.
Can you write Python code for it?

data.head(n=5)

data.plot(y='Weight', kind='hist',
          color='green',  title='Weight distribution')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Итак, мы решаем задачу: как через облако точек, соответсвующих наблюдениям в нашем наборе данных, в пространстве признаков "Рост" и "Вес" провести прямую линию так, чтобы минимизировать функционал из п. 6. Для начала давайте отобразим хоть какие-то прямые и убедимся, что они плохо передают зависимость роста от веса.
[7]. Проведите на графике из п. 5 Задания 1 две прямые, соответствующие значениям параметров ($w_0, w_1) = (60, 0.05)$ и ($w_0, w_1) = (50, 0.16)$. Используйте метод plot из matplotlib.pyplot, а также метод linspace библиотеки NumPy. Подпишите оси и график.
Can you write Python code for it?

plt.scatter(x=data['Weight'], y=data['Height'])
x_points = np.linspace(75, 175)
y1 = [func(60, 0.05, x) for x in x_points]
y2 = [func(50, 0.16, x) for x in x_points]

plt.plot(x_points, y1, color='red')
plt.plot(x_points, y2, color='green')
plt.xlim((75, 175))
plt.ylim((55, 80))

plt.xlabel('Вес')
plt.ylabel('Рост')
plt.title('Зависимость роста от веса')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Минимизация квадратичной функции ошибки - относительная простая задача, поскольку функция выпуклая. Для такой задачи существует много методов оптимизации. Посмотрим, как функция ошибки зависит от одного параметра (наклон прямой), если второй параметр (свободный член) зафиксировать.
[8]. Постройте график зависимости функции ошибки, посчитанной в п. 6, от параметра $w_1$ при $w_0$ = 50. Подпишите оси и график.
Can you write Python code for it?

W1 = np.linspace(-10, 10)
y = np.array([error(50, w1) for w1 in W1])

plt.plot(W1, y)
plt.xlabel('$w_1$')
plt.ylabel('Value of error')
plt.title('Зависимость ошибки от значения $w_1$')
plt.show()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Один из эффективных методов первичного анализа данных - отображение попарных зависимостей признаков. Создается $m \times m$ графиков (m - число признаков), где по диагонали рисуются гистограммы распределения признаков, а вне диагонали - scatter plots зависимости двух признаков. Это можно делать с помощью метода $scatter_matrix$ Pandas Data Frame или pairplot библиотеки Seaborn.
Чтобы проиллюстрировать этот метод, интересней добавить третий признак. Создадим признак Индекс массы тела (BMI). Для этого воспользуемся удобной связкой метода apply Pandas DataFrame и lambda-функций Python.
Can you write Python code for it?

def make_bmi(height_inch, weight_pound):
    METER_TO_INCH, KILO_TO_POUND = 39.37, 2.20462
    return (weight_pound / KILO_TO_POUND) / \
           (height_inch / METER_TO_INCH) ** 2

data['BMI'] = data.apply(lambda row: make_bmi(row['Height'],
                                              row['Weight']), axis=1)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Создаем объекты типа matplotlib.figure.Figure (рисунок) и  matplotlib.axes._subplots.Axes3DSubplot (ось).
Can you write Python code for it?

fig = plt.figure()
ax = fig.gca(projection='3d') # get current axis

# Создаем массивы NumPy с координатами точек по осям X и У.
# Используем метод meshgrid, при котором по векторам координат
# создается матрица координат. Задаем нужную функцию Z(x, y).
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# Наконец, используем метод *plot_surface* объекта
# типа Axes3DSubplot. Также подписываем оси.
surf = ax.plot_surface(X, Y, Z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Теперь методом оптимизации найдем "оптимальный" наклон прямой, приближающей зависимость роста от веса, при фиксированном коэффициенте $w_0 = 50$.
[9]. С помощью метода minimize_scalar из scipy.optimize найдите минимум функции, определенной в п. 6, для значений параметра  $w_1$ в диапазоне [-5,5]. Проведите на графике из п. 5 Задания 1 прямую, соответствующую значениям параметров ($w_0$, $w_1$) = (50, $w_1_opt$), где $w_1_opt$ – найденное в п. 8 оптимальное значение параметра $w_1$.
Can you write Python code for it?

import scipy.optimize as opt
error_wrap = lambda x: error(50, x)
result = opt.minimize_scalar(error_wrap, bounds=[-5, 5])
result

plt.scatter(x=data['Weight'], y=data['Height'])
x_points = np.linspace(75, 175)
y1 = [func(50, result.x, x) for x in x_points]

plt.plot(x_points, y1, color='red')
plt.xlim((75, 175))
plt.ylim((55, 80))

plt.xlabel('Вес')
plt.ylabel('Рост')
plt.title('Зависимость роста от веса')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Часто при первичном анализе данных надо исследовать зависимость какого-то количественного признака от категориального (скажем, зарплаты от пола сотрудника). В этом помогут "ящики с усами" - boxplots библиотеки Seaborn. Box plot - это компактный способ показать статистики вещественного признака (среднее и квартили) по разным значениям категориального признака. Также помогает отслеживать "выбросы" - наблюдения, в которых значение данного вещественного признака сильно отличается от других.
[4]. Создайте в DataFrame data новый признак weight_category, который будет иметь 3 значения: 1 – если вес меньше 120 фунтов. (~ 54 кг.), 3 - если вес  больше или равен 150 фунтов (~68 кг.), 2 – в остальных случаях. Постройте «ящик с усами» (boxplot), демонстрирующий зависимость роста от весовой категории. Используйте метод boxplot библиотеки Seaborn и метод apply Pandas DataFrame. Подпишите ось y меткой «Рост», ось x – меткой «Весовая категория».
Can you write Python code for it?

def weight_category(weight):
    if weight < 120:
        return 1
    elif weight >= 150:
        return 3
    else:
        return 2

data['weight_cat'] = data['Weight'].apply(weight_category)
ax = sns.boxplot(x='weight_cat', y='Height', data=data, )
ax.set_xlabel('Весовая категория')
ax.set_ylabel('Рост')
plt.plot()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/Linear_regression.ipynb".
The first task is:
Чаще всего первое, что надо надо сделать после считывания данных - это посмотреть на первые несколько записей. Так можно отловить ошибки чтения данных (например, если вместо 10 столбцов получился один, в названии которого 9 точек с запятой). Также это позволяет познакомиться с данными, как минимум, посмотреть на признаки и их природу (количественный, категориальный и т.д.).
После этого стоит построить гистограммы распределения признаков - это опять-таки позволяет понять природу признака (степенное у него распределение, или нормальное, или какое-то еще). Также благодаря гистограмме можно найти какие-то значения, сильно не похожие на другие - "выбросы" в данных.
Гистограммы удобно строить методом plot Pandas DataFrame с аргументом kind='hist'.
Пример. Построим гистограмму распределения роста подростков из выборки data. Используем метод plot для DataFrame data c аргументами y='Height' (это тот признак, распределение которого мы строим)
Can you write Python code for it?

data.plot(y='Height', kind='hist',
           color='red',  title='Height (inch.) distribution')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
1. Загрузите данные из файла advertising.csv в объект pandas DataFrame. Источник данных.
Can you write Python code for it?

import pandas as pd
adver_data = pd.read_csv('advertising.csv')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
2. Реализуйте функцию mserror - среднеквадратичную ошибку прогноза. Она принимает два аргумента - объекты Series y (значения целевого признака) и y_pred (предсказанные значения). Не используйте в этой функции циклы - тогда она будет вычислительно неэффективной.
Can you write Python code for it?

def mserror(y, y_pred):
    return np.sum(np.square(y - y_pred)) / len(y)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
5. Напишите функцию stochastic_gradient_step, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу X, вектора y и w, число train_ind - индекс объекта обучающей выборки (строки матрицы X), по которому считается изменение весов, а также число $\eta$ (eta) - шаг градиентного спуска (по умолчанию eta=0.01). Результатом будет вектор обновленных весов. Наша реализация функции будет явно написана для данных с 3 признаками, но несложно модифицировать для любого числа признаков, можете это сделать.
Can you write Python code for it?

def stochastic_gradient_step(X, y, w, train_ind, eta=0.01):
    x = X[train_ind] * (np.sum(X[train_ind] * w) - y[train_ind]) * (2 / X.shape[0])
    grad0 = x[0]
    grad1 = x[1]
    grad2 = x[2]
    grad3 = x[3]
    return  w - eta * np.array([grad0, grad1, grad2, grad3])


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
6. Напишите функцию stochastic_gradient_descent, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:
- X - матрица, соответствующая обучающей выборке
- y - вектор значений целевого признака
- w_init - вектор начальных весов модели
- eta - шаг градиентного спуска (по умолчанию 0.01)
- max_iter - максимальное число итераций градиентного спуска (по умолчанию 10000)
- max_weight_dist - максимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска,
при котором алгоритм прекращает работу (по умолчанию 1e-8)
- seed - число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42)
- verbose - флаг печати информации (например, для отладки, по умолчанию False)
На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов $w$, а также вектор (список) ошибок.
Can you write Python code for it?

def stochastic_gradient_descent(X, y, w_init, eta=1e-2, max_iter=1e4,
                                max_weight_dist=1e-8, seed=42, verbose=False):
    # Инициализируем расстояние между векторами весов на соседних
    # итерациях большим числом.
    weight_dist = np.inf
    # Инициализируем вектор весов
    w = w_init
    # Сюда будем записывать ошибки на каждой итерации
    errors = [mserror(y, linear_prediction(X, w))]
    # Счетчик итераций
    iter_num = 0
    # Будем порождать псевдослучайные числа
    # (номер объекта, который будет менять веса), а для воспроизводимости
    # этой последовательности псевдослучайных чисел используем seed.
    np.random.seed(seed)

    # Основной цикл
    while weight_dist > max_weight_dist and iter_num < max_iter:
        # порождаем псевдослучайный
        # индекс объекта обучающей выборки
        random_ind = np.random.randint(X.shape[0])

        # Ваш код здесь
        new_w = stochastic_gradient_step(X, y, w, random_ind, eta)
        errors.append(mserror(y, linear_prediction(X, new_w)))

        if verbose:
            print (errors[-1])
        weight_dist = np.sqrt(np.sum(np.square(new_w - w)))
        w = new_w
        iter_num += 1

    return w, errors


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Добавьте к матрице X столбец из единиц, используя методы hstack, ones и reshape библиотеки NumPy. Вектор из единиц нужен для того, чтобы не обрабатывать отдельно коэффициент $w_0$ линейной регрессии.
Can you write Python code for it?

X = np.hstack((X, np.ones(len(X)).reshape(len(X), 1)))
X


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Какие продажи предсказываются линейной моделью с весами, найденными с помощью нормального уравнения, в случае средних инвестиций в рекламу по ТВ, радио и в газетах? (то есть при нулевых значениях масштабированных признаков TV, Radio и Newspaper). Запишите ответ в файл '2.txt'.
Can you write Python code for it?

answer2 = np.sum(np.array([0, 0, 0, 1]) * norm_eq_weights)
print(answer2)
write_answer_to_file(answer2, '2.txt')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью градиентного спуска? Запишите ответ в файл '4.txt'.
Can you write Python code for it?

answer4 = mserror(y, linear_prediction(X, stoch_grad_desc_weights))
print(answer4)
write_answer_to_file(answer4, '4.txt')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Какова среднеквадратичная ошибка прогноза значений Sales в виде линейной модели с весами, найденными с помощью нормального уравнения? Запишите ответ в файл '3.txt'.
Can you write Python code for it?

answer3 = mserror(y, linear_prediction(X, norm_eq_weights))
print(answer3)
write_answer_to_file(answer3, '3.txt')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Какова среднеквадратичная ошибка прогноза значений Sales, если всегда предсказывать медианное значение Sales по исходной выборке? Запишите ответ в файл '1.txt'.
Can you write Python code for it?

answer1 = mserror(y, np.median(y))
print(answer1)
write_answer_to_file(answer1, '1.txt')


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Отмасштабируйте столбцы матрицы X, вычтя из каждого значения среднее по соответствующему столбцу и поделив результат на стандартное отклонение. Для определенности, используйте методы mean и std векторов NumPy (реализация std в Pandas может отличаться). Обратите внимание, что в numpy вызов функции .mean() без параметров возвращает среднее по всем элементам массива, а не по столбцам, как в pandas. Чтобы произвести вычисление по столбцам, необходимо указать параметр axis.
Can you write Python code for it?

means, stds = np.mean(X, axis=0), np.std(X, axis=0)

X = (X - means) / stds
X


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Посмотрим на вектор весов, к которому сошелся метод.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Посмотрим на среднеквадратичную ошибку на последней итерации.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Посмотрите на первые 5 записей и на статистику признаков в этом наборе данных.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_01/PA_linreg_stochastic_grad_descent.ipynb".
The first task is:
Создайте массивы NumPy X из столбцов TV, Radio и Newspaper и y - из столбца Sales. Используйте атрибут values объекта pandas DataFrame.
Can you write Python code for it?

import numpy as np
data = adver_data
X = np.array(data[['TV', 'Radio', 'Newspaper']])
y = np.array(data['Sales'])
X


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
F1-score
Очевидный недостаток пары метрик precision-recall - в том, что их две: непонятно, как ранжировать алгоритмы. Чтобы этого избежать, используют F1-метрику, которая равна среднему гармоническому precision и recall.
F1-метрика будет равна 1, если и только если precision = 1 и recall = 1 (идеальный алгоритм).
(: Обмануть F1 сложно: если одна из величин маленькая, а другая близка к 1 (по графикам видно, что такое соотношение иногда легко получить), F1 будет далека от 1. F1-метрику сложно оптимизировать, потому что для этого нужно добиваться высокой полноты и точности одновременно.
Например, посчитаем F1 для того же набора векторов, для которого мы строили графики (мы помним, что там одна из кривых быстро выходит в единицу).
Can you write Python code for it?

from sklearn.metrics import f1_score

T = 0.5
print("Разные склонности алгоритмов к ошибкам FP и FN:")
for actual, predicted, descr in zip([actual_1, actual_10, actual_11],
                                    [predicted_1 > T, predicted_10 > T, predicted_11 > T],
                                    ["Typical:", "Avoids FP:", "Avoids FN:"]):
    print(descr, "f1 =", f1_score(actual, predicted))


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
F1-метрика в двух последних случаях, когда одна из парных метрик равна 1, значительно меньше, чем в первом, сбалансированном случае.
<font color="green" size=5>Programming assignment: problem 2. </font> На precision и recall влияют и характер вектора вероятностей, и установленный порог.
Для тех же пар (actual, predicted), что и в предыдущей задаче, найдите оптимальные пороги, максимизирующие F1_score. Будем рассматривать только пороги вида T = 0.1 * k, k - целое; соответственно, нужно найти три значения k. Если f1 максимизируется при нескольких значениях k, укажите наименьшее из них.
Запишите найденные числа k в следующем порядке:
k_1, k_10, k_11
Цифры XXX после пробела соответствуют таким же цифрам в названиях переменных actual_XXX и predicted_XXX.
Передайте ответ в функцию write_answer_2. Загрузите файл в форму.
Если вы запишите список из трех найденных k в том же порядке в переменную ks, то с помощью кода ниже можно визуализировать найденные пороги:
Can you write Python code for it?

############### Programming assignment: problem 2 ###############
ks = np.zeros(3)
idexes = np.empty(3)
for threshold in np.arange(11):
    T = threshold * 0.1
    for actual, predicted, idx in zip([actual_1, actual_10, actual_11],
                                      [predicted_1 > T, predicted_10 > T, predicted_11 > T],
                                      [0, 1, 2]):
        score = f1_score(actual, predicted)
        if score > ks[idx]:
            ks[idx] = score
            idexes[idx] = threshold
print(ks)
print(idexes)
ks = idexes

many_scatters([actual_1, actual_10, actual_11], [predicted_1, predicted_10, predicted_11],
              np.array(ks)*0.1, ["Typical", "Avoids FP", "Avoids FN"], (1, 3))

def write_answer_2(k_1, k_10, k_11):
    answers = [k_1, k_10, k_11]
    with open("pa_metrics_problem2.txt", "w") as fout:
        fout.write(" ".join([str(num) for num in answers]))

write_answer_2(5, 3, 6)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Алгоритм может быть осторожным и стремиться сильно не отклонять вероятности от 0.5, а может рисковать - делать предсказания близакими к нулю или единице.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Все три метрики легко различают простые случаи хороших и плохих алгоритмов. Обратим внимание, что метрики имеют область значений  [0, 1], и потому их легко интерпретировать.
Метрикам не важны величины вероятностей, им важно только то, сколько объектов неправильно зашли за установленную границу (в данном случае T = 0.5).
Метрика accuracy дает одинаковый вес ошибкам false positive и false negative, зато пара метрик precision и recall однозначно идентифицирует это различие. Собственно, их для того и используют, чтобы контролировать ошибки FP и FN.
Мы измерили три метрики, фиксировав порог T = 0.5, потому что для почти всех картинок он кажется оптимальным. Давайте посмотрим на последней (самой интересной для этих метрик) группе векторов, как меняются precision и recall при увеличении порога.
Can you write Python code for it?

from sklearn.metrics import precision_recall_curve

precs = []
recs = []
threshs = []
labels = ["Typical", "Avoids FP", "Avoids FN"]
for actual, predicted in zip([actual_1, actual_10, actual_11],
                                    [predicted_1, predicted_10, predicted_11]):
    prec, rec, thresh = precision_recall_curve(actual, predicted)
    precs.append(prec)
    recs.append(rec)
    threshs.append(thresh)
plt.figure(figsize=(15, 5))
for i in range(3):
    ax = plt.subplot(1, 3, i+1)
    plt.plot(threshs[i], precs[i][:-1], label="precision")
    plt.plot(threshs[i], recs[i][:-1], label="recall")
    plt.xlabel("threshold")
    ax.set_title(labels[i])
    plt.legend()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Интервалы вероятностей для двух классов прекрасно разделяются порогом T = 0.5.
Чаще всего интервалы накладываются - тогда нужно аккуратно подбирать порог.
Самый неправильный алгоритм делает все наоборот: поднимает вероятности класса 0 выше вероятностей класса 1. Если так произошло, стоит посмотреть, не перепутались ли метки 0 и 1 при создании целевого вектора из сырых данных.
Примеры:
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Метрики, оценивающие векторы вероятностей класса 1
Рассмотренные метрики удобно интерпретировать, но при их использовании мы не учитываем большую часть информации, полученной от алгоритма. В некоторых задачах вероятности нужны в чистом виде, например, если мы предсказываем, выиграет ли команда в футбольном матче, и величина вероятности влияет на размер ставки за эту команду. Даже если в конце концов мы все равно бинаризуем предсказание, хочется следить за характером вектора вероятности.
Log_loss
Log_loss вычисляет правдоподобие меток в actual с вероятностями из predicted, взятое с противоположным знаком:
$log_loss(actual, predicted) = - \frac 1 n \sum_{i=1}^n (actual_i \cdot \log (predicted_i) + (1-actual_i) \cdot \log (1-predicted_i))$, $n$ - длина векторов.
Соответственно, эту метрику нужно минимизировать.
Вычислим ее на наших векторах:
Can you write Python code for it?

from sklearn.metrics import log_loss

print("Алгоритмы, разные по качеству:")
for actual, predicted, descr in zip([actual_0, actual_1, actual_2],
                                    [predicted_0, predicted_1, predicted_2],
                                    ["Perfect:", "Typical:", "Awful:"]):
    print(descr, log_loss(actual, predicted))
print()
print("Осторожный и рискующий алгоритмы:")
for actual, predicted, descr in zip([actual_0, actual_0r, actual_1, actual_1r],
                                    [predicted_0, predicted_0r, predicted_1, predicted_1r],
                                    ["Ideal careful", "Ideal risky", "Typical careful:", "Typical risky:"]):
    print(descr, log_loss(actual, predicted))
print()
print("Разные склонности алгоритмов к ошибкам FP и FN:")
for actual, predicted, descr in zip([actual_10, actual_11],
                                    [predicted_10, predicted_11],
                                    ["Avoids FP:", "Avoids FN:"]):
    print(descr, log_loss(actual, predicted))


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Мы описали разные характеры векторов вероятностей. Далее мы будем смотреть, как метрики оценивают разные векторы предсказаний, поэтому обязательно выполните ячейки, создающие векторы для визуализации.
Метрики, оценивающие бинарные векторы предсказаний
Есть две типичные ситуации, когда специалисты по машинному обучению начинают изучать характеристики метрик качества:
1. при участии в соревновании или решении прикладной задачи, когда вектор предсказаний оценивается по конкретной метрике, и нужно построить алгоритм, максимизирующий эту метрику.
1. на этапе формализации задачи машинного обучения, когда есть требования прикладной области, и нужно предложить математическую метрику, которая будет соответствовать этим требованиям.
Далее мы вкратце рассмотрим каждую метрику с этих двух позиций.
Precision и recall; accuracy
Для начала разберемся с метриками, оценивающие качество уже после бинаризации по порогу T, то есть сравнивающие два бинарных вектора: actual и predicted.
Две популярные метрики - precision и recall. Первая показывает, как часто алгоритм предсказывает класс 1 и оказывается правым, а вторая - как много объектов класса 1 алгоритм нашел.
Также рассмотрим самую простую и известную метрику - accuracy; она показывает долю правильных ответов.
Выясним преимущества и недостатки этих метрик, попробовав их на разных векторах вероятностей.
Can you write Python code for it?

from sklearn.metrics import precision_score, recall_score, accuracy_score

T = 0.5
print("Алгоритмы, разные по качеству:")
for actual, predicted, descr in zip([actual_0, actual_1, actual_2],
                                    [predicted_0 > T, predicted_1 > T, predicted_2 > T],
                                    ["Perfect:", "Typical:", "Awful:"]):
    print(descr, "precision =", precision_score(actual, predicted), "recall =", \
        recall_score(actual, predicted), ";",\
        "accuracy =", accuracy_score(actual, predicted))
print()
print("Осторожный и рискующий алгоритмы:")
for actual, predicted, descr in zip([actual_1, actual_1r],
                                    [predicted_1 > T, predicted_1r > T],
                                    ["Typical careful:", "Typical risky:"]):
    print(descr, "precision =", precision_score(actual, predicted), "recall =", \
        recall_score(actual, predicted), ";",\
        "accuracy =", accuracy_score(actual, predicted))
print()
print("Разные склонности алгоритмов к ошибкам FP и FN:")
for actual, predicted, descr in zip([actual_10, actual_11],
                                    [predicted_10 > T, predicted_11 > T],
                                    ["Avoids FP:", "Avoids FN:"]):
    print(descr, "precision =", precision_score(actual, predicted), "recall =", \
        recall_score(actual, predicted), ";",\
        "accuracy =", accuracy_score(actual, predicted))


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Обратите внимание на разницу weighted_log_loss между случаями Avoids FP и Avoids FN.
ROC и AUC
При построении ROC-кривой (receiver operating characteristic) происходит варьирование порога бинаризации вектора вероятностей, и  вычисляются величины, зависящие от числа ошибок FP и FN. Эти величины задаются так, чтобы в случае, когда существует порог для идеального разделения классов, ROC-кривая проходила через определенную точку - верхний левый угол квадрата [0, 1] x [0, 1]. Кроме того, она всегда проходит через левый нижний и правый верхний углы. Получается наглядная визуализация качества алгоритма. С целью охарактеризовать эту визуализацию численно, ввели понятие AUC - площадь под ROC-кривой.
Есть несложный и эффективный алгоритм, который за один проход по выборке вычисляет ROC-кривую и AUC, но мы не будем вдаваться в детали.
Построим ROC-кривые для наших задач:
Can you write Python code for it?

from sklearn.metrics import roc_curve, roc_auc_score

plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1)
aucs = ""
for actual, predicted, descr in zip([actual_0, actual_1, actual_2],
                                    [predicted_0, predicted_1, predicted_2],
                                    ["Perfect", "Typical", "Awful"]):
    fpr, tpr, thr = roc_curve(actual, predicted)
    plt.plot(fpr, tpr, label=descr)
    aucs += descr + ":%3f"%roc_auc_score(actual, predicted) + " "
plt.xlabel("false positive rate")
plt.ylabel("true positive rate")
plt.legend(loc=4)
plt.axis([-0.1, 1.1, -0.1, 1.1])
plt.subplot(1, 3, 2)
for actual, predicted, descr in zip([actual_0, actual_0r, actual_1, actual_1r],
                                    [predicted_0, predicted_0r, predicted_1, predicted_1r],
                                    ["Ideal careful", "Ideal Risky", "Typical careful", "Typical risky"]):
    fpr, tpr, thr = roc_curve(actual, predicted)
    aucs += descr + ":%3f"%roc_auc_score(actual, predicted) + " "
    plt.plot(fpr, tpr, label=descr)
plt.xlabel("false positive rate")
plt.ylabel("true positive rate")
plt.legend(loc=4)
plt.axis([-0.1, 1.1, -0.1, 1.1])
plt.subplot(1, 3, 3)
for actual, predicted, descr in zip([actual_1, actual_10, actual_11],
                                    [predicted_1, predicted_10, predicted_11],
                                    ["Typical", "Avoids FP", "Avoids FN"]):
    fpr, tpr, thr = roc_curve(actual, predicted)
    aucs += descr + ":%3f"%roc_auc_score(actual, predicted) + " "
    plt.plot(fpr, tpr, label=descr)
plt.xlabel("false positive rate")
plt.ylabel("true positive rate")
plt.legend(loc=4)
plt.axis([-0.1, 1.1, -0.1, 1.1])
print (aucs)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
При увеличении порога мы делаем меньше ошибок FP и больше ошибок FN, поэтому одна из кривых растет, а вторая  - падает. По такому графику можно подобрать оптимальное значение порога, при котором precision и recall будут приемлемы. Если такого порога не нашлось, нужно обучать другой алгоритм.
Оговоримся, что приемлемые значения precision и recall определяются предметной областью. Например, в задаче определения, болен ли пациент определенной болезнью (0 - здоров, 1 - болен), ошибок false negative стараются избегать, требуя recall около 0.9. Можно сказать человеку, что он болен, и при дальнейшей диагностике выявить ошибку; гораздо хуже пропустить наличие болезни.
<font color="green" size=5>Programming assignment: problem 1. </font> Фиксируем порог T = 0.65; по графикам можно примерно узнать, чему равны метрики на трех выбранных парах векторов (actual, predicted). Вычислите точные precision и recall для этих трех пар векторов.
6 полученных чисел запишите в текстовый файл в таком порядке:
precision_1 recall_1 precision_10 recall_10 precision_11 recall_11
Цифры XXX после пробела соответствуют таким же цифрам в названиях переменных actual_XXX и predicted_XXX.
Передайте ответ в функцию write_answer_1. Полученный файл загрузите в форму.
Can you write Python code for it?

############### Programming assignment: problem 1 ###############
T = 0.65
for _actual, _predicted in zip([actual_1, actual_10, actual_11],
                            [predicted_1, predicted_10, predicted_11]):
    print('Precision: %s' % precision_score(_actual, _predicted > T))
    print('Recall: %s\n' % recall_score(_actual, _predicted > T))

def write_answer_1(precision_1, recall_1, precision_10, recall_10, precision_11, recall_11):
    answers = [precision_1, recall_1, precision_10, recall_10, precision_11, recall_11]
    with open("pa_metrics_problem1.txt", "w") as fout:
        fout.write(" ".join([str(num) for num in answers]))

write_answer_1(1.0, 0.466666666667, 1.0, 0.133333333333, 0.647058823529, 0.846153846154)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Также интервалы могут смещаться. Если алгоритм боится ошибок false positive, то он будет чаще делать предсказания, близкие к нулю.
Аналогично, чтобы избежать ошибок false negative, логично чаще предсказывать большие вероятности.
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/MetricsPA.ipynb".
The first task is:
Что предсказывают алгоритмы
Для вычисления метрик качества в обучении с учителем нужно знать только два вектора: вектор правильных ответов и вектор предсказанных величин; будем обозначать их actual и predicted. Вектор actual известен из обучающей выборки, вектор predicted возвращается алгоритмом предсказания. Сегодня мы не будем использовать какие-то алгоритмы классификации, а просто рассмотрим разные векторы предсказаний.
В нашей формулировке actual состоит из нулей и единиц, а predicted - из величин из интервала [0, 1] (вероятности класса 1). Такие векторы удобно показывать на scatter plot.
Чтобы сделать финальное предсказание (уже бинарное), нужно установить порог T: все объекты, имеющие предсказание выше порога, относят к классу 1, остальные - к классу 0.
Can you write Python code for it?

# рисует один scatter plot
def scatter(actual, predicted, T):
    plt.scatter(actual, predicted)
    plt.xlabel("Labels")
    plt.ylabel("Predicted probabilities")
    plt.plot([-0.2, 1.2], [T, T])
    plt.axis([-0.1, 1.1, -0.1, 1.1])

# рисует несколько scatter plot в таблице, имеющей размеры shape
def many_scatters(actuals, predicteds, Ts, titles, shape):
    plt.figure(figsize=(shape[1]*5, shape[0]*5))
    i = 1
    for actual, predicted, T, title in zip(actuals, predicteds, Ts, titles):
        ax = plt.subplot(shape[0], shape[1], i)
        ax.set_title(title)
        i += 1
        scatter(actual, predicted, T)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
Блок 1. Ответьте на вопросы (каждый 0.5 балла):
1. Каков характер зависимости числа прокатов от месяца?
   * ответ: не линейная зависимость
1. Укажите один или два признака, от которых число прокатов скорее всего зависит линейно
   * ответ: yr, temp, atamp,
Давайте более строго оценим уровень линейной зависимости между признаками и целевой переменной. Хорошей мерой линейной зависимости между двумя векторами является корреляция Пирсона. В pandas ее можно посчитать с помощью двух методов датафрейма: corr и corrwith. Метод df.corr вычисляет матрицу корреляций всех признаков из датафрейма. Методу df.corrwith нужно подать еще один датафрейм в качестве аргумента, и тогда он посчитает попарные корреляции между признаками из df и этого датафрейма.
Can you write Python code for it?

# Код 1.1 (0.5 балла)
# Посчитайте корреляции всех признаков, кроме последнего, с последним с помощью метода corrwith:
df[df.columns[:-1]].corrwith(df[df.columns[-1]])


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
В выборке есть признаки, коррелирующие с целевым, а значит, задачу можно решать линейными методами.
По графикам видно, что некоторые признаки похожи друг на друга. Поэтому давайте также посчитаем корреляции между вещественными признаками.
Can you write Python code for it?

# Код 1.2 (0.5 балла)
# Посчитайте попарные корреляции между признаками temp, atemp, hum, windspeed(mph), windspeed(ms) и cnt
# с помощью метода corr:
df[['temp', 'atemp', 'hum', 'windspeed(mph)', 'windspeed(ms)', 'cnt']].corr()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
Давайте обучим линейную регрессию на наших данных и посмотрим на веса признаков.
Can you write Python code for it?

from sklearn.linear_model import LinearRegression

# Код 2.1 (1 балл)
# Создайте объект линейного регрессора, обучите его на всех данных и выведите веса модели
# (веса хранятся в переменной coef_ класса регрессора).
# Можно выводить пары (название признака, вес), воспользовавшись функцией zip, встроенной в язык python
# Названия признаков хранятся в переменной df.columns
reg = LinearRegression()
reg.fit(X, y)
for weight, name in zip(reg.coef_, df.columns[:-1]):
    print('%s - %s' % (name, weight))


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
Мы будем работать с датасетом "bikes_rent.csv", в котором по дням записаны календарная информация и погодные условия, характеризующие автоматизированные пункты проката велосипедов, а также число прокатов в этот день. Последнее мы будем предсказывать; таким образом, мы будем решать задачу регрессии.
Знакомство с данными
Загрузите датасет с помощью функции pandas.read_csv в переменную df. Выведите первые 5 строчек, чтобы убедиться в корректном считывании данных:
Can you write Python code for it?

df = pd.read_csv('bikes_rent.csv')
df.head()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
На диагоналях, как и полагается, стоят единицы. Однако в матрице имеются еще две пары сильно коррелирующих столбцов: temp и atemp (коррелируют по своей природе) и два windspeed (потому что это просто перевод одних единиц в другие). Далее мы увидим, что этот факт негативно сказывается на обучении линейной модели.
Напоследок посмотрим средние признаков (метод mean), чтобы оценить масштаб признаков и доли 1 у бинарных признаков.
Can you write Python code for it?

# Код 1.3 (0.5 балла)
# Выведите средние признаков
df.describe().iloc[[1]]


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_02/OverfittingTask.ipynb".
The first task is:
Проблема вторая: неинформативные признаки
В отличие от L2-регуляризации, L1 обнуляет веса при некоторых признаках. Объяснение данному факту дается в одной из лекций курса.
Давайте пронаблюдаем, как меняются веса при увеличении коэффициента регуляризации $\alpha$ (в лекции коэффициент при регуляризаторе мог быть обозначен другой буквой).
Can you write Python code for it?

# Код 3.1 (1 балл)
alphas = np.arange(1, 500, 50)
coefs_lasso = np.zeros((alphas.shape[0], X.shape[1])) # матрица весов размера (число регрессоров) x (число признаков)
coefs_ridge = np.zeros((alphas.shape[0], X.shape[1]))
# Для каждого значения коэффициента из alphas обучите регрессор Lasso
# и запишите веса в соответствующую строку матрицы coefs_lasso (вспомните встроенную в python функцию enumerate),
# а затем обучите Ridge и запишите веса в coefs_ridge.
for idx, alpha in enumerate(alphas):
    las = Lasso(alpha=alpha)
    las.fit(X, y)
    coefs_lasso[idx] = las.coef_

    rid = Ridge(alpha=alpha)
    rid.fit(X, y)
    coefs_ridge[idx] = rid.coef_


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Балансировка классов.
Алгоритмы классификации могут быть очень чувствительны к несбалансированным классам. Рассмотрим пример с выборками, сэмплированными из двух гауссиан. Их мат. ожидания и матрицы ковариации заданы так, что истинная разделяющая поверхность должна проходить параллельно оси x. Поместим в обучающую выборку 20 объектов, сэмплированных из 1-й гауссианы, и 10 объектов из 2-й. После этого обучим на них линейную регрессию, и построим на графиках объекты и области классификации.
Can you write Python code for it?

np.random.seed(0)
"""Сэмплируем данные из первой гауссианы"""
data_0 = np.random.multivariate_normal([0,0], [[0.5,0],[0,0.5]], size=40)
"""И из второй"""
data_1 = np.random.multivariate_normal([0,1], [[0.5,0],[0,0.5]], size=40)
"""На обучение берём 20 объектов из первого класса и 10 из второго"""
example_data_train = np.vstack([data_0[:20,:], data_1[:10,:]])
example_labels_train = np.concatenate([np.zeros((20)), np.ones((10))])
"""На тест - 20 из первого и 30 из второго"""
example_data_test = np.vstack([data_0[20:,:], data_1[10:,:]])
example_labels_test = np.concatenate([np.zeros((20)), np.ones((30))])
"""Задаём координатную сетку, на которой будем вычислять область классификации"""
xx, yy = np.meshgrid(np.arange(-3, 3, 0.02), np.arange(-3, 3, 0.02))
"""Обучаем регрессию без балансировки по классам"""
optimizer = GridSearchCV(LogisticRegression(), param_grid, cv=cv, n_jobs=-1)
optimizer.fit(example_data_train, example_labels_train)
"""Строим предсказания регрессии для сетки"""
Z = optimizer.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel2)
plt.scatter(data_0[:,0], data_0[:,1], color='red')
plt.scatter(data_1[:,0], data_1[:,1], color='blue')
"""Считаем AUC"""
auc_wo_class_weights = roc_auc_score(example_labels_test, optimizer.predict_proba(example_data_test)[:,1])
plt.title('Without class weights')
plt.show()
print('AUC: %f'%auc_wo_class_weights)
"""Для второй регрессии в LogisticRegression передаём параметр class_weight='balanced'"""
optimizer = GridSearchCV(LogisticRegression(class_weight='balanced'), param_grid, cv=cv, n_jobs=-1)
optimizer.fit(example_data_train, example_labels_train)
Z = optimizer.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Pastel2)
plt.scatter(data_0[:,0], data_0[:,1], color='red')
plt.scatter(data_1[:,0], data_1[:,1], color='blue')
auc_w_class_weights = roc_auc_score(example_labels_test, optimizer.predict_proba(example_data_test)[:,1])
plt.title('With class...


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Видно, что в датасете есть как числовые, так и категориальные признаки. Получим списки их названий:
Can you write Python code for it?

numeric_cols = ['RFCD.Percentage.1', 'RFCD.Percentage.2', 'RFCD.Percentage.3',
                'RFCD.Percentage.4', 'RFCD.Percentage.5',
                'SEO.Percentage.1', 'SEO.Percentage.2', 'SEO.Percentage.3',
                'SEO.Percentage.4', 'SEO.Percentage.5',
                'Year.of.Birth.1', 'Number.of.Successful.Grant.1', 'Number.of.Unsuccessful.Grant.1']
categorical_cols = list(set(X.columns.values.tolist()) - set(numeric_cols))
len(numeric_cols)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Видно, что данный метод преобразования данных уже позволяет строить нелинейные разделяющие поверхности, которые могут более тонко подстраиваться под данные и находить более сложные зависимости. Число признаков в новой модели:
Can you write Python code for it?


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Видно, что нет.
Исправить ситуацию можно разными способами, мы рассмотрим два:
- давать объектам миноритарного класса больший вес при обучении классификатора (рассмотрен в примере выше)
- досэмплировать объекты миноритарного класса, пока число объектов в обоих классах не сравняется
Задание 3. Балансировка классов.

Обучите логистическую регрессию и гиперпараметры с балансировкой классов, используя веса (параметр class_weight='balanced' регрессии) на отмасштабированных выборках, полученных в предыдущем задании. Убедитесь, что вы нашли максимум accuracy по гиперпараметрам.
Получите метрику ROC AUC на тестовой выборке.
Сбалансируйте выборку, досэмплировав в неё объекты из меньшего класса. Для получения индексов объектов, которые требуется добавить в обучающую выборку, используйте следующую комбинацию вызовов функций:
        np.random.seed(0)
        indices_to_add = np.random.randint(...)
        X_train_to_add = X_train[y_train.as_matrix() == 1,:][indices_to_add,:]
   После этого добавьте эти объекты в начало или конец обучающей выборки. Дополните соответствующим      образом вектор ответов.
Получите метрику ROC AUC на тестовой выборке, сравните с предыдущим результатом.
Внесите ответы в выходной файл при помощи функции write_asnwer_3, передав в неё сначала ROC AUC для балансировки весами, а потом балансировки выборки вручную.
Can you write Python code for it?

def write_answer_3(auc_1, auc_2):
    auc = (auc_1 + auc_2) / 2
    with open("preprocessing_lr_answer3.txt", "w") as fout:
        fout.write(str(auc))

# place your code here

def make_thinks_balanced(X_train, X_test):
    train = X_train[:]
    test = X_test[:]

    train = np.hstack((X_train_cat_oh, train))
    test = np.hstack((X_test_cat_oh, test))

    estimator = LogisticRegression(class_weight='balanced')
    optimizer = GridSearchCV(estimator, param_grid, cv=cv)
    optimizer.fit(train, y_train)
    plot_scores(optimizer)
    print(roc_auc_score(y_test, optimizer.predict_proba(test)[:, 1]))

make_thinks_balanced(X_train_real_scaled, X_test_real_scaled)

np.random.seed(0)
indices_to_add = np.random.randint(low = 0, high = np.sum((y_train.as_matrix() == 1)), size = np.sum(y_train==0) - np.sum(y_train==1))

def make_thinks_stratification(X_train, X_test):
    train = X_train[:]
    test = X_test[:]

    train = np.hstack((X_train_cat_oh, train))
    test = np.hstack((X_test_cat_oh, test))

    train = np.vstack((train, train[indices_to_add]))
    y_train_new = np.append(y_train.as_matrix(), np.ones_like(indices_to_add))

    estimator = LogisticRegression()
    optimizer = GridSearchCV(estimator, param_grid, cv=cv)
    optimizer.fit(train, y_train_new)
    plot_scores(optimizer)
    print(roc_auc_score(y_test, optimizer.predict_proba(test)[:, 1]))
make_thinks_stratification(X_train_real_scaled, X_test_real_scaled)

write_answer_3(0.887506790191, 0.887093501091)
auc_wo_class_weights = 0.887175168997
auc_w_class_weights = 0.887506790191


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Видно, что тогда мы выбросим почти все данные, и такой метод решения в данном случае не сработает.
Пропущенные значения можно так же интерпретировать, для этого существует несколько способов, они различаются для категориальных и вещественных признаков.
Для вещественных признаков:
- заменить на 0 (данный признак давать вклад в предсказание для данного объекта не будет)
- заменить на среднее (каждый пропущенный признак будет давать такой же вклад, как и среднее значение признака на датасете)
Для категориальных:
- интерпретировать пропущенное значение, как ещё одну категорию (данный способ является самым естественным, так как в случае категорий у нас есть уникальная возможность не потерять информацию о наличии пропущенных значений; обратите внимание, что в случае вещественных признаков данная информация неизбежно теряется)
Задание 0. Обработка пропущенных значений.

Заполните пропущенные вещественные значения в X нулями и средними по столбцам, назовите полученные датафреймы X_real_zeros и X_real_mean соответственно. Для подсчёта средних используйте описанную ниже функцию calculate_means, которой требуется передать на вход вешественные признаки из исходного датафрейма.
Все категориальные признаки в X преобразуйте в строки, пропущенные значения требуется также преобразовать в какие-либо строки, которые не являются категориями (например, 'NA'), полученный датафрейм назовите X_cat.

Для объединения выборок здесь и далее в задании рекомендуется использовать функции
np.hstack(...)
np.vstack(...)
Can you write Python code for it?

def calculate_means(numeric_data):
    means = np.zeros(numeric_data.shape[1])
    for j in range(numeric_data.shape[1]):
        to_sum = numeric_data.iloc[:,j]
        indices = np.nonzero(~numeric_data.iloc[:,j].isnull())[0]
        correction = np.amax(to_sum[indices])
        to_sum /= correction
        for i in indices:
            means[j] += to_sum[i]
        means[j] /= indices.size
        means[j] *= correction
    return pd.Series(means, numeric_data.columns)

means = calculate_means(X[numeric_cols])
X_real_zeros = X[numeric_cols]
X_real_mean = X[numeric_cols]

for idx, column in enumerate(numeric_cols):
    X_real_zeros[column].fillna(0, inplace=True)
    X_real_mean[column].fillna(means.iloc[idx], inplace=True)

X_cat = X[categorical_cols]
for column in categorical_cols:
    X_cat[column] =  X_cat[column].apply(lambda x: str(x))
    X_cat[column] = X_cat[column].fillna('NA')
X_cat.info()


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Выделим из датасета целевую переменную Grant.Status и обозначим её за y
Теперь X обозначает обучающую выборку, y - ответы на ней
Can you write Python code for it?

X = data.drop('Grant.Status', 1)
y = data['Grant.Status']


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Для построения метрики качества по результату обучения требуется разделить исходный датасет на обучающую и тестовую выборки.
Обращаем внимание на заданный параметр для генератора случайных чисел: random_state. Так как результаты на обучении и тесте будут зависеть от того, как именно вы разделите объекты, то предлагается использовать заранее определённое значение для получение результатов, согласованных с ответами в системе проверки заданий.
Can you write Python code for it?

from sklearn.cross_validation import train_test_split

(X_train_real_zeros,
 X_test_real_zeros,
 y_train, y_test) = train_test_split(X_real_zeros, y,
                                     test_size=0.3,
                                     random_state=0)
(X_train_real_mean,
 X_test_real_mean) = train_test_split(X_real_mean,
                                      test_size=0.3,
                                      random_state=0)
(X_train_cat_oh,
 X_test_cat_oh) = train_test_split(X_cat_oh,
                                   test_size=0.3,
                                   random_state=0)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Как видно из графиков, мы не поменяли свойства признакового пространства: гистограммы распределений значений признаков, как и их scatter-plots, выглядят так же, как и до нормировки, но при этом все значения теперь находятся примерно в одном диапазоне, тем самым повышая интерпретабельность результатов, а также лучше сочетаясь с идеологией регуляризации.
Задание 2. Сравнение качества классификации до и после масштабирования вещественных признаков.

Обучите ещё раз регрессию и гиперпараметры на новых признаках, объединив их с закодированными категориальными.
Проверьте, был ли найден оптимум accuracy по гиперпараметрам во время кроссвалидации.
Получите значение ROC AUC на тестовой выборке, сравните с лучшим результатом, полученными ранее.
Запишите полученный ответ в файл при помощи функции write_answer_2.
Can you write Python code for it?

def write_answer_2(auc):
    with open("preprocessing_lr_answer2.txt", "w") as fout:
        fout.write(str(auc))

make_thinks(X_train_real_scaled, X_test_real_scaled)

write_answer_2(0.887175168997)


I am working on the file "Coursera/Machine-learning-data-analysis/Course 2/Week_03/Preprocessing_LR.ipynb".
The first task is:
Как видно из графиков, разные признаки очень сильно отличаются друг от друга по модулю значений (обратите внимание на диапазоны значений осей x и y). В случае обычной регрессии это никак не влияет на качество обучаемой модели, т.к. у меньших по модулю признаков будут большие веса, но при использовании регуляризации, которая штрафует модель за большие веса, регрессия, как правило, начинает работать хуже.
В таких случаях всегда рекомендуется делать стандартизацию (масштабирование) признаков, для того чтобы они меньше отличались друг друга по модулю, но при этом не нарушались никакие другие свойства признакового пространства. При этом даже если итоговое качество модели на тесте уменьшается, это повышает её интерпретабельность, потому что новые веса имеют смысл "значимости" данного признака для итоговой классификации.
Стандартизация осуществляется посредством вычета из каждого признака среднего значения и нормировки на выборочное стандартное отклонение:
$$ x^{scaled}{id} = \dfrac{x{id} - \mu_d}{\sigma_d}, \quad \mu_d = \frac{1}{N} \sum_{i=1}^l x_{id}, \quad \sigma_d = \sqrt{\frac{1}{N-1} \sum_{i=1}^l (x_{id} - \mu_d)^2} $$
Задание 1.5. Масштабирование вещественных признаков.

По аналогии с вызовом one-hot encoder примените масштабирование вещественных признаков для обучающих и тестовых выборок X_train_real_zeros и X_test_real_zeros, используя класс StandardScaler

и методы
    StandardScaler.fit_transform(...)
    StandardScaler.transform(...)

Сохраните ответ в переменные X_train_real_scaled и X_test_real_scaled соответственно
Can you write Python code for it?

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler(with_mean=True, with_std=True)
scaler.fit(X_train_real_mean)
X_train_real_scaled = scaler.fit_transform(X_train_real_mean)
X_test_real_scaled = scaler.fit_transform(X_test_real_mean)